C# 中的分段上传错误

本文关键字:错误 分段 | 更新日期: 2023-09-27 18:37:18

当我将部分大小设置为 5MB 时,我正在尝试使用 AWS 上传文件,代码工作正常,但是当我尝试将部分大小更改为 1MB 时,它给了我一个异常:代码是

            string strusername = "user1";       
            strlocalpath = "C:''file1.zip";    
            string BUCKET_NAME = "bucket1";
            string filename = "file1.zip"
            string keypath = strusername + "/" + filename;
            string keyName = "123";
            string filePath = strlocalpath;
            // List to store upload part responses.
            List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();
            // 1. Initialize.
            InitiateMultipartUploadRequest initRequest =
                new InitiateMultipartUploadRequest()
                .WithBucketName(BUCKET_NAME)
                .WithKey(keyName);
            InitiateMultipartUploadResponse initResponse =
                s3Client.InitiateMultipartUpload(initRequest);
            // 2. Upload Parts.
            long contentLength = new FileInfo(filePath).Length;
            //Set Part size 
            long partSize = 1*1024*1024; // 5 MB
            try
            {
                long filePosition = 0;
                for (int i = 1; filePosition < contentLength; i++)
                {
                    if (filePosition + partSize > contentLength)
                    {
                        partSize = contentLength - filePosition;
                    }
                    // Create request to upload a part.
                    UploadPartRequest uploadRequest = new UploadPartRequest()
                        .WithBucketName(BUCKET_NAME)
                        .WithKey(keyName)
                        .WithUploadId(initResponse.UploadId)
                        .WithPartNumber(i)
                        .WithPartSize(partSize)
                        .WithFilePosition(filePosition)
                        .WithFilePath(filePath)
                        .WithTimeout(60*60*60);
                    // Upload part and add response to our list.
                    uploadResponses.Add(s3Client.UploadPart(uploadRequest));
                    filePosition += partSize;

                    Console.WriteLine("'nTotal uploaded size = " + filePosition.ToString());
                }
                // Step 3: complete.
                CompleteMultipartUploadRequest compRequest =
                    new CompleteMultipartUploadRequest()
                    .WithBucketName(BUCKET_NAME)
                    .WithKey(keyName)
                    .WithUploadId(initResponse.UploadId)
                    .WithPartETags(uploadResponses);
                CompleteMultipartUploadResponse completeUploadResponse =
                    s3Client.CompleteMultipartUpload(compRequest);
            }
            catch (Exception exception)
            {
                Console.WriteLine("Exception occurred: {0}", exception.Message);
                s3Client.AbortMultipartUpload(new AbortMultipartUploadRequest()
                    .WithBucketName(BUCKET_NAME)
                    .WithKey(keyName)
                    .WithUploadId(initResponse.UploadId));
            }

例外情况是:

<Error>
<Code>EntityTooSmall</Code>
<Message>Your proposed upload is smaller than the minimum allowed size</Message>   
<ETag>d9c00192bcf6bf7412814a8fe0422b0c</ETag>
<MinSizeAllowed>5242880</MinSizeAllowed>
<ProposedSize>1048576</ProposedSize>
<RequestId>PBG04E031C012F34</RequestId>
<HostId>VEjvpkjuk89yS4xW6Bl/+NPpb3yxvbbe7ijjPmTrlXc7hnjj89kjkm</HostId> 
<PartNumber>1</PartNumber></Error>

我想以 1 MB 或 2MB 的块上传文件,可以这样做吗?

谢谢

C# 中的分段上传错误

S3 上传的最小分段大小为 5 MB。

http://docs.aws.amazon.com/AmazonS3/latest/dev/qfacts.html

显然,最后一部分通常会更小,这很好。

"最后一部分"可能更小这一事实的副作用是,例如,如果您有一个 500 KB 的文件并将其作为分段上传发送,则"第一部分"也是"最后一部分"并且这仍然有效,因为它满足"最后一部分"可以小于 5MB 的规则, 但您仍然必须明确使用不小于 5 MB 的部分大小。

我在测试默认为 64MB 的分段上传时发现了这一点。 它仍然可以在较小的文件上运行良好,这些文件作为小于 5MB 的单个"部分"进行多部分上传。

看起来你的尺寸弄错了。

S3 文档:上传部分

每个部分的大小必须至少为 5 MB,最后一个部分除外。那里 分段上传的最后一部分没有大小限制。

所以不,你不能指定做小于5MB的部分。 当做多部分时,它会自动允许最后一部分,假设最后一部分不是第一/唯一的部分,小于5MB。


冰川文档:亚马逊的启动分段上传文档指出:

启动分段上传时,您可以在 字节数。部分大小必须为兆字节 (1024 KB) 乘以 2 的幂,例如,1048576 (1 MB)、2097152 (2 MB) 4194304 (4 MB)、8388608 (8 MB) 等。允许的最小零件尺寸为 1 MB,最大值为 4 GB。

您的代码具有long partSize = 1*1024*1024 1048576这是从上面1 MB的,而不是您的注释所说的 5MB。

并注意将来参考或同一问题,来自同一链接:

使用此上传 ID 上传的每个部分(最后一个除外)都必须 具有相同的大小。最后一个可以是相同大小或更小。为 例如,假设您要上传一个 16.2 MB 的文件。如果您发起 分段上传,分段大小为 4 MB,您将上传四个 每个部分为 4 MB,一部分为 0.2 MB。

有一个简单的规则:如果您的文件小于 5Mb,请将其分一部分上传。