当前位置:首页 > VUE

vue实现分段上传

2026-02-10 20:19:48VUE

实现分段上传的基本思路

分段上传(分片上传)是将大文件分割为多个小块分别上传,最后在服务端合并的技术。Vue 中可通过前端分片、并发上传、进度监控等方式实现。

前端文件分片处理

使用 JavaScript 的 Blob.slice() 方法对文件进行分片。假设每片大小为 2MB:

function createFileChunks(file, chunkSize = 2 * 1024 * 1024) {
  const chunks = [];
  let start = 0;
  while (start < file.size) {
    const end = Math.min(start + chunkSize, file.size);
    chunks.push(file.slice(start, end));
    start = end;
  }
  return chunks;
}

上传逻辑实现

通过 FormData 封装分片数据,使用 axios 或其他 HTTP 库上传:

async function uploadChunk(chunk, index, fileHash) {
  const formData = new FormData();
  formData.append('chunk', chunk);
  formData.append('index', index);
  formData.append('hash', fileHash);
  return axios.post('/api/upload', formData, {
    onUploadProgress: (e) => {
      // 更新单个分片的上传进度
    }
  });
}

并发控制与进度计算

通过 Promise.all 或并发队列控制同时上传的分片数量,并计算整体进度:

vue实现分段上传

async function uploadAllChunks(chunks, fileHash, maxConcurrency = 3) {
  const progressList = Array(chunks.length).fill(0);
  const pool = new Set();

  for (let i = 0; i < chunks.length; i++) {
    const task = uploadChunk(chunks[i], i, fileHash).then(() => {
      pool.delete(task);
    });
    pool.add(task);

    if (pool.size >= maxConcurrency) {
      await Promise.race(pool);
    }
  }
  await Promise.all(pool);
}

服务端配合要点

  1. 分片接收:服务端需提供接口接收分片,保存为临时文件,记录分片索引。
  2. 合并请求:当所有分片上传完成后,前端发送合并请求,服务端按顺序拼接分片。
  3. 断点续传:前端上传前先查询已上传的分片列表,跳过已上传部分。

完整示例代码

<template>
  <input type="file" @change="handleFileChange" />
  <button @click="startUpload">上传</button>
  <div>总进度: {{ totalProgress }}%</div>
</template>

<script>
export default {
  data() {
    return {
      file: null,
      totalProgress: 0
    };
  },
  methods: {
    handleFileChange(e) {
      this.file = e.target.files[0];
    },
    async startUpload() {
      const chunks = createFileChunks(this.file);
      const fileHash = await this.calculateHash();
      await uploadAllChunks(chunks, fileHash);
      // 发送合并请求
      await axios.post('/api/merge', { hash: fileHash });
    },
    calculateHash() {
      // 使用 SparkMD5 等库计算文件唯一哈希
    }
  }
};
</script>

优化建议

  1. 文件哈希生成:使用 Web Worker 计算文件 MD5,避免主线程阻塞。
  2. 暂停/恢复功能:记录已上传分片信息,重新上传时跳过已完成部分。
  3. 错误重试机制:对失败的分片自动重试上传。
  4. 分片大小动态调整:根据网络状况动态改变分片大小。

以上方案需配合后端接口实现完整的断点续传功能。服务端需要设计分片存储、校验和合并逻辑。

标签: 上传vue
分享给朋友:

相关文章

vue实现主页

vue实现主页

Vue 实现主页的基本步骤 创建一个 Vue 主页通常涉及以下几个关键步骤,从项目初始化到页面布局和功能实现。 初始化 Vue 项目 使用 Vue CLI 或 Vite 初始化项目。Vue CLI…

vue实现剪辑

vue实现剪辑

Vue 实现视频剪辑功能 在Vue中实现视频剪辑功能通常需要结合HTML5的<video>元素和第三方库(如FFmpeg.js或Video.js)。以下是几种常见的实现方法: 使用FFm…

vue实现画图

vue实现画图

Vue 实现画图功能 在 Vue 中实现画图功能通常需要结合 HTML5 的 <canvas> 元素或第三方库。以下是几种常见的方法: 使用原生 Canvas API 通过 Vue 直接…

vue实现展开

vue实现展开

展开功能的实现方法 在Vue中实现展开功能可以通过多种方式完成,常见的有使用v-show、v-if指令,结合CSS过渡动画或第三方组件库。 使用v-show控制显示隐藏 通过v-show指令可以简单…

vue实现项目依赖

vue实现项目依赖

Vue 项目依赖的实现方法 使用 npm 或 yarn 安装依赖 通过 npm 或 yarn 安装项目所需的依赖包。在项目根目录下运行以下命令安装 Vue 及相关库: npm install vue…

vue实现表格多行修改

vue实现表格多行修改

实现表格多行修改的方法 数据绑定与表格渲染 使用v-model绑定表格数据到Vue实例的data属性。通过v-for循环渲染表格行,并为每行数据添加编辑状态标识。 <template>…