You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:57:24