我正在尝试使用AWS上传文件,当我将部件大小设置为5MB时,代码工作正常,但是当我尝试将部件大小更改为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或2 MB的块上传文件是否可以这样做?
由于
答案 0 :(得分:2)
看起来你的尺码错了。
S3文档: Upload Part
除最后一部分外,每个部分的大小必须至少为5 MB。那里 在分段上传的最后一部分没有大小限制。
所以不,你不能指定做小于5MB的零件。当进行多部分时,它将自动允许最后一部分(假设最后一部分不是第一部分/唯一部分)小于5MB。
冰川文件: Amazon's Initiate MultiPart Upload documentation州:
当您启动分段上传时,请在中指定零件尺寸 字节数。部件大小必须是兆字节(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
为{{1}},而不是评论中的5MB。
以及未来参考或相同问题的说明,来自同一链接:
您使用此上传ID上传的每个部分(最后一个除外)都必须 具有相同的大小。最后一个可以是相同尺寸或更小。对于 例如,假设您要上传16.2 MB的文件。如果你发起 部分大小为4 MB的分段上传,您将上传四个 每个4 MB的部分和0.2 MB的一部分。
答案 1 :(得分:2)
S3上传的最小部分大小为5 MB。
http://docs.aws.amazon.com/AmazonS3/latest/dev/qfacts.html
显然,最后一部分通常会更小,这很好。
“最后一部分”可以更小的一个副作用是,例如,如果你有一个500 KB的文件并且你将它作为分段上传发送,那么“第一部分”也是“最后一部分”部分“这仍然有效,因为它满足”最后一部分“可以小于5MB的规则,但你仍然必须明确使用不小于5 MB的部件大小。
我在测试multipart-uploaded时发现了这一点,默认为64MB。它仍适用于较小的文件,它可以将多部分上传为单个“部分”,小于5MB。
答案 2 :(得分:0)
有一个简单的规则:如果您的文件小于5Mb,则将其上传到一个部分。