S3 分段上传抛出大小要求错误。可能没有正确识别最后一部分

问题描述 投票:0回答:1

我正在尝试通过分段上传将文件从我的 React Native 应用程序上传到 S3。

如果文件超过 1 个部分(部分大小为 5MB,最后一个小于 5MB),我会收到以下错误:

“您建议上传的内容小于允许的最小大小”。

但对于小于 5mb 的文件来说效果很好。让我感到困惑的是,我使用相同的代码从网络应用程序进行多部分上传,效果很好,而且我没有收到大小错误。

我正确生成了零件,例如26mb 文件包含 6 个部分。

可能是什么问题?好像不认识最后一部分。

amazon-web-services amazon-s3 multipart
1个回答
0
投票

听起来这个问题可能与 React Native 应用程序处理文件的最后部分(小于 5MB)有关。 AWS S3 的分段上传要求除最后一个部分外的每个部分的大小至少为 5MB。以下是一些需要检查的事项:

1. 检查最后一部分的零件大小和上传逻辑

  • 确保您的代码正确地单独处理最后一部分,并且它被识别为上传的最后部分。对于分段上传,除最后一个部分之外的所有部分都需要为 5MB 或更大。

2. 设置每个部分的内容长度

  • 验证您是否正确设置了每个部件的
    Content-Length
    标头,因为这有时会导致 AWS 识别部件尺寸时出现问题。

3. 完成分段上传:

  • 确认最后一个部分被标记为分段上传中的最后一个部分。在AWS中,每个部分都必须上传,并且上传过程必须通过调用
    completeMultipartUpload
    来完成。

以下是如何构建上传代码以正确处理最后一部分的示例:

async function uploadFile(file) {
    const chunkSize = 5 * 1024 * 1024; // 5MB
    const numParts = Math.ceil(file.size / chunkSize);
    let partNumber = 1;

    // Initialize multipart upload
    const { uploadId } = await initiateMultipartUpload(file);

    for (let start = 0; start < file.size; start += chunkSize) {
        const end = Math.min(start + chunkSize, file.size);
        const partData = file.slice(start, end);

        // Upload each part
        await uploadPart(uploadId, partNumber, partData);

        partNumber++;
    }

    // Complete multipart upload
    await completeMultipartUpload(uploadId);
}

async function uploadPart(uploadId, partNumber, partData) {
    await s3.uploadPart({
        Body: partData,
        ContentLength: partData.size,
        PartNumber: partNumber,
        UploadId: uploadId
    }).promise();
}

4. 比较 Web 和 React Native 之间的配置:

  • 由于您的代码在 Web 应用程序上运行,因此请确保特定于 React Native 的任何配置(例如存储库或网络)不会导致部件生成或上传方式出现问题。

5. 调试提示

  • 您可以使用AWS SDK的
    listParts
    功能来确认每个部分是否在S3端被识别,特别是最后一个部分。
© www.soinside.com 2019 - 2024. All rights reserved.