Vue实现大文件分片上传、断点续传

前言

实现大文件分片上传的断点续传以及上传进度条是一个在前端开发中常见且具有挑战性的问题。本篇博客将介绍如何使用Vue框架来实现这个功能,并给出代码示例。

概述

大文件分片上传指的是将一个大文件切割成多个小文件(或称为分片),然后依次上传这些小文件,最后在服务器端将这些小文件合并为原始的大文件。断点续传则是在上传过程中遇到意外情况(如网络中断、浏览器崩溃等)导致上传中断后,能够从中断的地方继续上传而不是重新上传整个文件。

要实现大文件分片上传的断点续传以及上传进度条,我们可以使用以下步骤:

将大文件切割成多个小文件。

使用FormData对象将每个小文件上传到服务器端。

记录已经成功上传的分片信息,用于断点续传。

在前端显示上传进度条。

实现步骤

1. 切割大文件

在前端使用File API的slice方法将大文件切割成多个小文件。代码示例如下:

复制代码
const CHUNK_SIZE = 1024 * 1024; // 设置每个分片的大小为1MB

function splitFile(file) {
  const chunks = [];
  let start = 0;
  while (start < file.size) {
    const end = Math.min(start + CHUNK_SIZE, file.size);
    const chunk = file.slice(start, end);
    chunks.push(chunk);
    start += CHUNK_SIZE;
  }
  return chunks;
}

2. 上传分片

使用axios或其他HTTP请求库将每个分片上传到服务器端。代码示例如下:

复制代码
function uploadChunk(chunk) {
  const formData = new FormData();
  formData.append('file', chunk);

  return axios.post('/upload', formData, {
    headers: {
      'Content-Type': 'multipart/form-data'
    },
    onUploadProgress: progressEvent => {
      const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total);
      console.log(`Uploaded ${percentCompleted}%`);
    }
  });
}

3. 断点续传

记录已经成功上传的分片信息,可以使用localStorage或其他数据存储方式。代码示例如下:

复制代码
function saveUploadedChunks(chunks) {
  const uploadedChunks = getUploadedChunks();
  chunks.forEach(chunk => {
    if (!uploadedChunks.includes(chunk.name)) {
      uploadedChunks.push(chunk.name);
    }
  });
  localStorage.setItem('uploadedChunks', JSON.stringify(uploadedChunks));
}

function getUploadedChunks() {
  const uploadedChunks = localStorage.getItem('uploadedChunks');
  return uploadedChunks ? JSON.parse(uploadedChunks) : [];
}

4. 显示上传进度条

在前端页面中利用Vue框架渲染上传进度条,并根据上传进度更新进度条的宽度。代码示例如下:

复制代码
<template>
  <div>
    <div class="progress-bar" :style="{ width: progress + '%' }"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      progress: 0
    };
  },
  methods: {
    updateProgress(percentCompleted) {
      this.progress = percentCompleted;
    }
  }
};
</script>

在切割文件、上传分片和更新进度的过程中,可以将相关代码封装成一个Vue组件或函数,并在需要上传大文件的页面中使用。

总结

本篇博客介绍了如何使用Vue框架实现大文件分片上传的断点续传以及上传进度条。通过切割文件、上传分片、记录已上传分片信息和显示上传进度条等步骤,我们可以实现更可靠和用户友好的大文件上传功能。

相关推荐
胡萝卜术3 小时前
力扣5. 最长回文子串
前端·javascript·面试
我星期八休息3 小时前
网络编程—应用层HTTP协议
linux·运维·开发语言·前端·网络·网络协议·http
不好听6133 小时前
前端路由完全指南(下篇):懒加载、History 栈与工程化实践
前端·react.js
触底反弹5 小时前
🔥 从零搭建 RAG 知识库:爬虫→分词→向量化→检索,一步都不能错
javascript·人工智能·面试
圣光SG6 小时前
Java Web入门基础知识笔记
java·前端·笔记
cyforkk6 小时前
Vercel 绑定自定义域名极简配置指南
服务器·前端·网络
এ慕ོ冬℘゜7 小时前
JavaScript 数组核心方法实战|新增元素 + 数组转字符串 零基础详解
开发语言·javascript·ecmascript
IT_陈寒8 小时前
React useEffect依赖数组中埋的坑,这次终于让我逮到了
前端·人工智能·后端
FourAu8 小时前
2026 前端突围指南:从 ESR 边缘渲染到封装 Web AI SDK,聊聊 AI 时代的职业进化
前端·人工智能