客户端请求支持分片上传吗

分片上传不是服务器的单人表演

很多人以为文件上传只是把数据扔给服务器就完事了,其实大文件上传时,光靠服务器支持还不够。关键问题来了:客户端请求本身支持分片上传吗?答案是——不直接支持,但能实现。

HTTP 协议没规定分片,但也没拦着

标准的 HTTP 请求并没有强制要求必须一次性传完整个文件。换句话说,协议层面允许你把一个大文件拆成几块,一块一块地发。这就像寄快递,你可以把一箱书分成几个包裹陆续寄出,只要收件方知道怎么拼回去就行。

所以,虽然“分片上传”不是 HTTP 的内置功能,但客户端完全可以主动发起多个请求,每次上传一个片段。这种操作在技术上完全可行,而且已经被广泛使用。

前端怎么做到分片?用的是 Blob.slice

在浏览器里,JavaScript 可以通过 File API 操作用户选择的文件。比如你选了一个 100MB 的视频,可以用 Blob.slice() 方法把它切成每片 5MB 的小块:

const file = document.getElementById('fileInput').files[0];
const chunkSize = 5 * 1024 * 1024; // 5MB
for (let start = 0; start < file.size; start += chunkSize) {
  const chunk = file.slice(start, start + chunkSize);
  uploadChunk(chunk, start, file.size); // 发送每个片段
}

每一段都可以封装成独立的 POST 请求,带上当前片段的序号、偏移量和总大小,服务器就能按顺序重组原始文件。

客户端得和服务器“对好暗号”

光客户端切片不行,服务器也得配合。常见的做法是客户端先发一个初始化请求,申请一个上传任务 ID,然后按序上传各片。服务器记录哪些片收到了,最后所有片齐了再合并落盘。

比如你在网盘上传一个安装包,断网后重连,客户端可以查询已上传的片段,跳过已传部分,接着传剩下的——这就是所谓的“断点续传”,核心依赖的就是分片机制。

表单上传不行?那就换种方式

传统的 <form enctype='multipart/form-data'> 是整体提交,没法控制分片。但现代前端早就不用这种方式处理大文件了。取而代之的是用 fetchXMLHttpRequest 手动控制每一个请求,把文件切片后逐个发送。

像百度网盘、腾讯文档这些产品,背后都是这么干的。你拖进一个 2GB 的压缩包,页面不会卡死,也不会因为网络抖动整个重来,体验丝滑的背后就是分片上传在撑着。

移动端和桌面端同样适用

不只是网页,手机 App 上传相册视频、桌面客户端同步文件夹,都会遇到大文件问题。这些客户端程序天然可以控制传输逻辑,分片上传几乎是标配方案。它们会根据网络状况动态调整片大小,甚至并发上传多个片段来提速。

所以说,客户端不仅“支持”分片上传,很多时候还是推动这个机制落地的关键一环。没有客户端的主动拆分和管理,光靠服务器被动接收,根本玩不转。