FineUploader Azure分片上传异常:块上传成功但块列表提交失败
排查FineUploader Azure分片上传块合并失败问题
我之前处理过类似的大文件分片上传场景,你遇到的“块上传成功但合并操作失败”问题,大概率是权限、CORS配置或者FineUploader细节设置出了问题,下面给你一步步分析和排查方案:
可能的原因及排查步骤
1. SAS签名权限不足
合并块的操作需要**Write(w)和Add(a)**两种权限,如果后端生成的SAS令牌只给了Add权限,就会被Azure拒绝(通常返回403 Forbidden):
- 检查你的
/shared-access-signature接口返回的SAS令牌,确保权限参数包含wa(比如&sp=wa); - 同时要保证SAS的有效期足够长,覆盖大文件上传的整个过程(10GB文件按4MB分片,即使并发上传也需要不少时间,过期的SAS会直接导致合并失败)。
2. Azure Blob的CORS配置不完整
合并块属于PUT请求,需要Azure存储账户的CORS规则允许PUT方法,并且包含必要的请求头:
- 登录Azure门户,找到你的存储账户,进入资源共享(CORS);
- 针对Blob服务的规则,确保:
- 允许的方法包含
PUT; - 允许的源是你的网站域名(测试时可以用
*,生产环境建议指定具体域名); - 允许的头包含
x-ms-blob-type、x-ms-date、x-ms-version、content-type; - 暴露的头包含
ETag(FineUploader需要获取块的ETag来生成合法的块列表)。
- 允许的方法包含
3. 并发分片上传的潜在冲突
你开启了concurrent.enabled: true,虽然FineUploader理论上会处理块的顺序和ETag收集,但网络延迟可能导致块的ETag没有被正确记录,进而合并时块列表不匹配:
- 先尝试禁用并发上传(把
concurrent.enabled改为false),测试是否能成功合并块; - 如果禁用后正常,那可能是并发场景下的ETag收集问题,可以尝试升级FineUploader到最新版本,或者调整分片大小减少并发数量。
4. 查看合并请求的具体错误信息
最直接的定位方式是通过浏览器开发者工具:
- 打开F12开发者工具,切换到Network标签;
- 上传大文件,找到最后那个带有
comp=blocklist的PUT请求(这就是合并块的请求); - 查看该请求的状态码和响应内容:
- 403:大概率是SAS权限或CORS配置问题;
- 400:可能是块列表格式错误,或者某个块的ETag不正确;
- 404:容器或Blob路径有误(但你未分片时能正常上传,这个可能性较低)。
5. FineUploader版本兼容性
旧版本的FineUploader Azure插件可能存在分片合并的bug,建议检查你使用的版本,尝试升级到最新稳定版,看是否能解决问题。
针对你代码的小修正
你的代码中button = document.getElementById('#file-picker-button');多了个#,getElementById不需要加选择器前缀,应该改成:
button = document.getElementById('file-picker-button');
虽然这个不是分片合并失败的直接原因,但可能导致按钮绑定异常,建议先修正。
内容的提问来源于stack exchange,提问作者Kory Dondzila
相关产品推荐
相关产品推荐

