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

上传大文件时,卡到一半失败,刷新重来又得从头开始——这种情况你肯定遇到过。其实解决办法早就有了:分片上传。那问题来了,客户端请求本身支持分片上传吗?答案是:HTTP 协议不直接提供“分片上传”这个功能,但客户端可以通过手动实现分片,配合服务端完成。

分片上传是怎么回事

分片上传,就是把一个大文件切成多个小块(比如每块5MB),然后逐个上传。每个小块独立发送请求,传完再由服务端拼接成完整文件。这样做有几个明显好处:网络中断只影响当前分片,可以续传;上传进度更易控制;还能并发上传提升速度。

客户端怎么发分片请求

浏览器的 File APIBlob.slice() 方法让这一切变得可行。你可以读取用户选择的文件,按大小切片,然后用 FormData 包装每一个分片,通过 fetchXMLHttpRequest 发出去。

const file = document.getElementById('fileInput').files[0];
const chunkSize = 5 * 1024 * 1024; // 5MB
let start = 0;

while (start < file.size) {
  const chunk = file.slice(start, start + chunkSize);
  const formData = new FormData();
  formData.append('chunk', chunk);
  formData.append('filename', file.name);
  formData.append('chunkIndex', start / chunkSize);

  fetch('/upload-chunk', {
    method: 'POST',
    body: formData
  });

  start += chunkSize;
}

上面这段代码就是典型的前端分片逻辑。每次上传都带上文件名、分片序号,服务端根据这些信息重组文件。

需要服务端配合

客户端能发分片,不代表光靠它就能完成上传。服务端必须支持接收分片、暂存、校验,并在所有分片到位后合并。常见做法是用唯一ID标记一次上传会话,避免不同用户的文件搞混。

像七牛、阿里云OSS这类对象存储服务,本身就提供了分片上传接口(也叫Multipart Upload),客户端只需要按它们的协议一步步调用即可。这种场景下,客户端“支持”分片上传,其实是通过遵循特定API实现的。

断点续传也能做

如果上传中途断了,客户端可以先向服务端查询已上传的分片列表,跳过已完成的部分,接着传剩下的。这需要服务端暴露一个查询接口,比如 /uploaded-chunks?fileId=xxx,客户端拿到结果后再决定从哪继续。

实际项目中,像百度网盘、钉钉文件上传、企业微信发大附件,背后基本都是这套机制。你拖一个2GB的视频进去,界面显示“正在分片上传”,其实就是前端在悄悄发一个个小请求。

所以,别指望一个普通 POST 请求自动支持分片。但只要前端动手切,后端愿意接,分片上传一点都不玄乎。它不是协议自带的功能,而是开发者用代码搭出来的实用方案。