当前位置:首页 > 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-cropperjs 库 vue-cropperjs 是一个基于 cropperjs 的 Vue 组件,专门用于图片裁剪。安装方式如下: npm inst…

vue SSG实现

vue SSG实现

Vue SSG 实现方法 Vue 的静态站点生成(SSG)可以通过多种工具和框架实现,以下是几种常见的方法: 使用 VuePress VuePress 是一个基于 Vue 的静态站点生成器,适合文档…

vue实现上传

vue实现上传

Vue 文件上传实现方法 使用 Vue 实现文件上传可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的事件处理和数据绑定来实现。 基础实现步骤…

vue实现视频

vue实现视频

Vue 实现视频播放的方法 在 Vue 项目中实现视频播放可以通过多种方式完成,以下是几种常见的方法: 使用 HTML5 的 <video> 标签 在 Vue 组件中直接使用 HTML…

vue实现keepalive

vue实现keepalive

Vue 中实现 keep-alive 在 Vue 中,keep-alive 是一个内置组件,用于缓存动态组件或组件的状态,避免重复渲染和销毁。以下是实现 keep-alive 的几种方法: 基本用法…

vue实现登录权限

vue实现登录权限

Vue 实现登录权限方案 路由守卫控制访问权限 安装vue-router并配置路由守卫,在全局前置守卫中检查用户登录状态和权限。未登录用户访问受限路由时重定向到登录页。 // router.js r…