亚马逊的限制
亚马逊分段传输,要求每个小段的大小不能小于5M
代码实操
//提供awsAccessKeyId和awsSecretAccessKey构造凭证
var credentials = new BasicAWSCredentials("accesskey", "secretKey");
//提供awsEndPoint(域名)进行访问配置
var clientConfig = new AmazonS3Config
{
ServiceURL = "https://s3.ap-east-1.amazonaws.com",
ForcePathStyle = true
};
var client = new AmazonS3Client(credentials, clientConfig);
var data = File.ReadAllBytes("d:\\aa.zip");
var key = "test/a.zip";
var initRet = await client.InitiateMultipartUploadAsync("yourBucketName", key);
List<PartETag> partETags = new List<PartETag>();
var partNum = 1;
for (var i = 0; i < data.Length;)
{
UploadPartRequest partRequest = new UploadPartRequest();
partRequest.BucketName = "yourBucketName";
partRequest.UploadId = initRet.UploadId;
partRequest.Key = key;
partRequest.PartNumber = partNum++;
partRequest.FilePosition = i;
//亚马逊限制每段最小5M
partRequest.InputStream = new MemoryStream(data, i, Math.Min(data.Length - i, 1024 * 1024 * 5));
partRequest.IsLastPart = (data.Length - i) < 1024 * 1024 * 5;
i += (int)partRequest.InputStream.Length;
var ret = await client.UploadPartAsync(partRequest);
partETags.Add(new PartETag(ret));
}
var retCompleted = await client.CompleteMultipartUploadAsync(new CompleteMultipartUploadRequest
{
UploadId = initRet.UploadId,
BucketName = "yourBucketName",
Key = key,
PartETags = partETags,
});
//设置文件访问权限
await client.PutACLAsync(new PutACLRequest
{
CannedACL = S3CannedACL.PublicRead,
BucketName = retCompleted.BucketName,
Key = retCompleted.Key,
});