当前位置:首页 > VUE

vue大文件下载实现

2026-01-21 05:10:53VUE

分片下载实现大文件下载

使用axios配合Blob对象实现分片下载,避免一次性加载大文件导致内存溢出。通过设置responseType: 'blob'Range请求头实现分片:

async function downloadLargeFile(url, fileName, chunkSize = 1024 * 1024 * 10) {
  const fileBlob = new Blob();
  let startByte = 0;
  let endByte = chunkSize - 1;

  while (true) {
    const response = await axios.get(url, {
      headers: { 'Range': `bytes=${startByte}-${endByte}` },
      responseType: 'blob'
    });

    const receivedBytes = response.data.size;
    if (receivedBytes === 0) break;

    fileBlob = new Blob([fileBlob, response.data]);
    startByte = endByte + 1;
    endByte = startByte + chunkSize - 1;
  }

  const downloadUrl = URL.createObjectURL(fileBlob);
  const a = document.createElement('a');
  a.href = downloadUrl;
  a.download = fileName;
  document.body.appendChild(a);
  a.click();
  URL.revokeObjectURL(downloadUrl);
  a.remove();
}

使用StreamSaver.js实现流式下载

对于超大文件(GB级别),推荐使用StreamSaver.js库实现真正的流式下载,避免内存占用问题:

vue大文件下载实现

import streamSaver from 'streamsaver';

async function streamDownload(url, fileName) {
  const fileStream = streamSaver.createWriteStream(fileName);
  const response = await fetch(url);
  const readableStream = response.body;

  if (window.WritableStream && readableStream.pipeTo) {
    return readableStream.pipeTo(fileStream);
  }

  const writer = fileStream.getWriter();
  const reader = response.body.getReader();

  const pump = () => reader.read()
    .then(res => res.done 
      ? writer.close() 
      : writer.write(res.value).then(pump));

  return pump();
}

进度显示与中断控制

添加下载进度显示和中断控制功能,提升用户体验:

vue大文件下载实现

let controller = new AbortController();

async function downloadWithProgress(url, fileName) {
  const response = await fetch(url, {
    signal: controller.signal
  });

  const totalBytes = +response.headers.get('Content-Length');
  let receivedBytes = 0;
  const chunks = [];
  const reader = response.body.getReader();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    chunks.push(value);
    receivedBytes += value.length;
    const progress = (receivedBytes / totalBytes * 100).toFixed(2);
    console.log(`Downloaded ${progress}%`);
  }

  const blob = new Blob(chunks);
  // ...保存逻辑同前
}

// 中断下载
function abortDownload() {
  controller.abort();
}

服务端配合要求

服务端需要支持以下特性才能实现完整的大文件下载功能:

  • 支持Range请求头(HTTP 206 Partial Content)
  • 正确返回Content-Length头信息
  • 对于分片下载需支持Accept-Ranges: bytes
  • 若使用CORS需配置Access-Control-Expose-Headers: Content-Length, Content-Range

断点续传实现

通过本地存储记录已下载的字节位置,实现断点续传功能:

function resumeDownload(url, fileName) {
  const savedProgress = localStorage.getItem(`dl_${fileName}`);
  let startByte = savedProgress ? parseInt(savedProgress) : 0;

  // 修改Range头
  const headers = { 'Range': `bytes=${startByte}-` };

  // 在每次收到数据时更新存储
  const updateProgress = (received) => {
    localStorage.setItem(`dl_${fileName}`, startByte + received);
  };
}

标签: 大文件vue
分享给朋友:

相关文章

vue实现tab换行

vue实现tab换行

Vue实现Tab切换的常见方法 使用Vue实现Tab切换功能可以通过多种方式完成,以下是几种常见的方法: 动态组件结合v-if或v-show 通过v-if或v-show控制不同Tab内容的显示与隐…

vue的实现

vue的实现

Vue 的实现原理 Vue 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是 Vue 实现的主要技术细节。 响应式系统 Vue 的响…

vue实现定位

vue实现定位

Vue 中实现定位的方法 在 Vue 中实现定位可以通过以下几种方式: 使用 CSS 定位 通过 CSS 的 position 属性实现定位,Vue 中可以直接在组件的 <style>…

vue实现节流

vue实现节流

vue实现节流的方法 在Vue中实现节流(throttle)功能,通常用于限制高频事件的触发频率,例如滚动、输入或按钮点击。以下是几种常见的实现方式: 使用Lodash的throttle函数 安装L…

vue实现driver

vue实现driver

Vue 实现 Driver.js 引导功能 Driver.js 是一个轻量级的 JavaScript 库,用于在网页上创建引导式导览。以下是在 Vue 项目中集成 Driver.js 的详细方法:…

vue实现网站

vue实现网站

Vue 实现网站的基本步骤 Vue.js 是一个渐进式 JavaScript 框架,适合构建现代化的单页应用(SPA)或动态网站。以下是使用 Vue 实现网站的基本方法。 初始化 Vue 项目 使用…