跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

前端大文件分片上传实现与断点续传方案

针对大文件上传易超时、中断及网络波动问题,基于分片上传与断点续传的解决方案。核心逻辑包括前端文件切片、查询已上传分片列表、逐片上传校验及最终合并。提供了完整的 JavaScript 实现代码,涵盖 slice 切片、FormData 传输、服务端接口交互说明及常见问题处理,支持自动跳过已上传片段并完善错误处理,适用于视频、安装包等大文件场景。

小熊软糖发布于 2026/4/6更新于 2026/7/2452 浏览

在上传大文件(如视频、安装包、模型文件)时,直接上传容易出现以下问题:

  • 文件过大 → 浏览器/服务器容易超时
  • 上传过程中断 → 重新上传浪费时间
  • 网络波动 → 上传失败率高

因此,大文件分片上传 + 断点续传 + 秒传校验 是目前最通用、最稳定的解决方案。

本文将通过一段完整可运行的示例代码,详细讲解如何在前端实现分片上传、断点续传、服务端校验等关键功能。

实现效果

  • ✔ 自动切片(默认 5MB/片,可配置)
  • ✔ 查询已上传分片(断点续传)
  • ✔ 自动跳过已上传的片段
  • ✔ 每片上传成功后重新校验
  • ✔ 所有片段上传完成后自动触发合并
  • ✔ 错误处理完善

核心代码

以下代码是本文的核心逻辑,经过梳理解释后更易理解:

export async function uploadLargeFile({ file, fileId, id, chunkSize = 5 * 1024 * 1024, apiCheckChunks, apiUploadChunk, apiMergeChunks }) {
  if (!file) throw new Error("file 不能为空");
  if (!fileId) throw new Error("fileId 不能为空");
  const fileName = file.name;
  const totalChunks = Math.ceil(file.size / chunkSize);
  const chunks = [];
  // 1. 前端文件切片
  for (let i = 0; i < totalChunks; i++) {
    const start = i * chunkSize;
    const end = Math.min(file.size, start + chunkSize);
    chunks.push(file.slice(start, end));
  }
  
   res =  (fileId, id);
   uploadedList = .(res.) ? res. : [];
   (!.(uploadedList)) uploadedList = [];
  
   ( i = ; i < totalChunks; i++) {
     (uploadedList.(i)) {
      .();
      ;
    }
     formData =  ();
    formData.(, fileId);
    formData.(, id);
    formData.(, i);
    formData.(, totalChunks);
    formData.(, chunks[i]);
     (formData);
    
     res1 =  (fileId, id);
    uploadedList = res1. || [];
     (!uploadedList.(i)) {
        ();
    }
  }
  
   (uploadedList. === totalChunks) {
    .();
     (fileId, fileName, id);
  }  {
      ();
  }
   ;
}
// 2. 查询已上传分片(断点续传)
let
await
apiCheckChunks
let
Array
isArray
data
data
if
Array
isArray
// 3. 逐片上传
for
let
0
if
includes
console
log
`分片 ${i} 已上传,跳过`
continue
const
new
FormData
append
"fileId"
append
"id"
append
"chunkIndex"
append
"totalChunks"
append
"chunk"
await
apiUploadChunk
// 上传成功后重新查询列表(确保状态正确)
const
await
apiCheckChunks
data
if
includes
throw
new
Error
`分片 ${i} 上传失败,请重试`
// 4. 所有片段上传完成 → 执行合并
if
length
console
log
"所有分片上传完成,开始合并文件"
await
apiMergeChunks
else
throw
new
Error
"未上传完所有分片,无法合并"
return
true

详细逻辑解析

1. 前端切片(slice 实现)

file.slice(start, end)

浏览器原生提供 slice,因此实现非常简单。

如果选择 5MB 一个片段,1GB 文件会被切成:

Math.ceil(1024MB / 5MB) = 205 片

2. 查询已上传分片(断点续传关键)

let res = await apiCheckChunks(fileId, id); let uploadedList = Array.isArray(res.data) ? res.data : [];

服务端返回的数据通常是:

[0, 3, 5, 6]

前端据此跳过已上传片段,避免重复上传,大幅提升效率。

3. 上传文件分片(FormData)

每个分片上传都附带:

  • 分片 index
  • 总分片数
  • chunk 二进制数据
  • 业务 ID 或用户 ID

这是一个完整的可追踪数据结构,支持合并校验。

4. 每片上传后重新校验(确保上传成功)

const res1 = await apiCheckChunks(fileId, id); uploadedList = res1.data || [];

避免服务器延迟导致状态不同步,确保每片上传成功。

5. 全部上传完毕 → 调用合并

await apiMergeChunks(fileId, fileName, id);

后端将所有片段按顺序合并成最终文件。

后端接口交互说明(简版)

前端需要的接口:

接口功能
apiCheckChunks(fileId)查询已上传的分片列表
apiUploadChunk(formData)上传某个片段
apiMergeChunks(fileId, fileName)合并所有片段

通常后端会在服务器临时目录中创建:

/upload/tmp/{fileId}/0 /upload/tmp/{fileId}/1 /upload/tmp/{fileId}/2 ...

然后合并成:

/upload/merged/xxx.mp4

常见问题(FAQ)

1. 为什么 uploadedList.includes 报错?

通常是:

  • 服务端返回的数据不是数组
  • res.data 为 null
  • uploadedList 不是数组直接调用 includes 出错

你的代码已经做了兜底处理:

let uploadedList = Array.isArray(res.data) ? res.data : [];

但仍要保证服务端返回值格式正确。

总结

本文展示了一个完整可用的前端大文件分片上传工具方法,支持:

  • 文件切片
  • 分片校验
  • 断点续传
  • 分片上传
  • 自动合并

其优势是:

  • 前端逻辑清晰
  • 易接入任何 UI(Vue/React/uni-app)
  • 可结合后端实现秒传(加 MD5 校验)
  • 非常适合大文件上传场景

使用示例

// 父组件提交表单 调用大文件上传
addAndUpload(formData).then(async (res) => {
  if (res.status === 'success') {
    this.$message({ message: '操作成功', type: 'success' });
    this.file_Id = res.data.fileId;
    loading.close();
    this.dialogVisible = false;
    if (this.upFile !== null) {
      const fileId = this.file_Id;
      const file = this.upFile;
      this.$message.info("大文件,启动分片上传...");
      try {
        await uploadLargeFile({
          file,
          fileId,
          id: res.data.id,
          chunkSize: 20 * 1024 * 1024,
          apiCheckChunks: (fileId, id) => checkChunks({ fileId, id }),
          apiUploadChunk: (formData) => uploadChunk(formData),
          apiMergeChunks: (fileId, fileName, id) => mergeChunks({ fileId, fileName, id })
        });
        this.$message.success("大文件上传完成");
      } catch (err) {
        this.$message.error("分片上传失败");
        console.error(err);
      }
    }
    this.getData();
    this.resetForm2(formName);
  } else {
    this.$message({ message: res.msg, type: 'warning' });
    loading.close();
  }
});

目录

  1. 实现效果
  2. 核心代码
  3. 详细逻辑解析
  4. 1. 前端切片(slice 实现)
  5. 2. 查询已上传分片(断点续传关键)
  6. 3. 上传文件分片(FormData)
  7. 4. 每片上传后重新校验(确保上传成功)
  8. 5. 全部上传完毕 → 调用合并
  9. 后端接口交互说明(简版)
  10. 常见问题(FAQ)
  11. 1. 为什么 uploadedList.includes 报错?
  12. 总结
  13. 使用示例
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Linux 部署 NapCat QQ 机器人
  • SpringAI 通过 Ollama 本地部署 Deepseek 模型构建对话机器人
  • OpenVLA 模型架构与训练详解:基于 Prismatic VLM 的动作预测
  • 低代码诞生的背景:传统开发模式在规模化后的核心瓶颈
  • 前端网页开发基础:HTML、CSS 与 JavaScript 入门教程
  • Python 开发 QQ 机器人实战:基于 Mirai 框架
  • 西门子 S7-1200FC PLC 与松下机器人 Profinet 通信及外部控制实战
  • Go Web 必备理论
  • PyCharm 与 GitHub Copilot 配置指南:学生认证与安全设置
  • 数据结构核心:顺序表的原理与模拟实现
  • ROS1 机器人 SLAM 详解:Gmapping 算法原理与实战
  • AI 提示词工程:原理、策略与精通指南
  • Windows 下创建并激活 Python 虚拟环境 venv
  • C 语言指针与数组的深层关系及实战
  • 前端表单验证策略与最佳实践
  • Flutter 三方库 flutter_cors 应对鸿蒙 Web 与混合开发中的跨域挑战
  • Python 基础语法入门(一)
  • AI Skills 核心概念与实战搭建指南
  • Git 如何将特定提交合并到另一个分支?
  • C++伸展树介绍以及红黑树的实现

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online