Reputation: 4350
I am trying to upload a large file to Amazon S3. I first used the PutObject
and it worked fine but took about 5 hours to upload a 2GB file. So I read some online suggestions and tried it with the TransferUtility
.
I have increased the timeout but this TransferUtility API always give me "The request was aborted. The request was canceled."
error.
code sample:
public void UploadWithMultiPart(string BucketName, string s3_key, string fileName)
{
var fileTransferUtility = new Amazon.S3.Transfer.TransferUtility(_accessKey, _secretKey);
var request = new Amazon.S3.Transfer.TransferUtilityUploadRequest()
.WithBucketName(BucketName)
.WithKey(s3_key)
.WithFilePath(fileName)
.WithTimeout(60*60*1000*100)
.WithPartSize(1024 * 1024 * 100)
.WithCannedACL(S3CannedACL.PublicRead)
.WithStorageClass(S3StorageClass.ReducedRedundancy);
request.Timeout = 60*60*1000*100;
fileKey = s3_key;
request.UploadProgressEvent += new EventHandler<UploadProgressArgs>(uploadRequest_UploadPartProgressEvent);
//.with = 30000
// .AddHeader("x-amz-acl", "public-read")
fileTransferUtility.Upload(request);
}
public void Upload(string BucketName, string s3_key, string fileName)
{
Amazon.S3.Model.PutObjectRequest request = new Amazon.S3.Model.PutObjectRequest();
request.WithBucketName(BucketName);
request.WithKey(s3_key);
request.WithFilePath(fileName);
request.Timeout = -1;
request.ReadWriteTimeout = 30000;
request.AddHeader("x-amz-acl", "public-read");
s3Client.PutObject(request);
}
Upvotes: 1
Views: 4585
Reputation: 390
Try This
private TransferUtility transferUtility;
transferUtility = new TransferUtility(awsAccessKey, awsSecretKey);
AsyncCallback callback = new AsyncCallback(UploadComplete);
var putObjectRequest = new Amazon.S3.Transfer.TransferUtilityUploadRequest()
{
FilePath = filePath,
BucketName = awsBucketName,
Key = awsFilePath,
ContentType = contentType,
StorageClass = S3StorageClass.ReducedRedundancy,
ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256,
CannedACL = S3CannedACL.Private
};
IAsyncResult ar = transferUtility.BeginUpload(putObjectRequest, callback, null);
ThreadPool.QueueUserWorkItem(c =>
{
transferUtility.EndUpload(ar);
});
Upvotes: 1