Cloudflare R2分片上传所有分片ETag值相同问题求助
问题
在使用Cloudflare R2分片上传时,上传分片环节出现异常:所有分片返回的ETag值完全相同。分片上传流程包含初始化上传、上传分片、完成上传三步,上传分片的代码如下:
const uploadId = url.searchParams.get('uploadId'); const partNumberString = url.searchParams.get('partNumber'); if (partNumberString === null || uploadId === null) { return new Response('Missing partNumber or uploadId', { status: 400, }); } const formData = await request.formData(); const fileData = formData.get('file'); if (fileData === null) { return new Response('Missing fileData', { status: 400 }); } const partNumber = parseInt(partNumberString); const multipartUpload = bucket.resumeMultipartUpload(key, uploadId); try { const uploadedPart: R2UploadedPart = await multipartUpload.uploadPart(partNumber, fileData); return new Response(JSON.stringify(uploadedPart)); } catch (error: any) { // important! when error, directly abort multipart upload multipartUpload.abort(); return new Response(error.message, { status: 400 }); }
返回结果示例:
part {"partNumber":1,"etag":"385113dc95710b41a9cd107ca02bb9d8"} part {"partNumber":2,"etag":"385113dc95710b41a9cd107ca02bb9d8"} part {"partNumber":3,"etag":"385113dc95710b41a9cd107ca02bb9d8"} part {"partNumber":4,"etag":"385113dc95710b41a9cd107ca02bb9d8"}
代码参考R2官方文档编写,请问错误出在哪里?
问题原因与修复
问题出在**fileData的处理**上:从formData.get('file')获取的File对象直接传入uploadPart时,可能因为未正确读取文件内容,导致实际上传的是空数据——所有空分片的ETag自然完全相同。
修复时需要将File对象转换为ArrayBuffer或ReadableStream后再传入,确保分片内容被正确读取。修改代码中的上传逻辑:
方案1:转为ArrayBuffer
// 替换原uploadPart调用代码 const fileBuffer = await fileData.arrayBuffer(); const uploadedPart: R2UploadedPart = await multipartUpload.uploadPart(partNumber, fileBuffer);
方案2:使用ReadableStream
// 替换原uploadPart调用代码 const fileStream = fileData.stream(); const uploadedPart: R2UploadedPart = await multipartUpload.uploadPart(partNumber, fileStream);
额外注意事项:
- 确保每个分片的
partNumber从1开始连续递增,无重复或缺失 - 避免在单个请求中重复使用同一个
File对象的流,防止读取位置异常 - 异常处理中直接中止整个多段上传的逻辑,需根据业务场景判断是否合理(比如仅当前分片失败时,是否需要保留已上传的分片)
内容的提问来源于stack exchange,提问作者ryandra
相关产品推荐
相关产品推荐

