[英]progress information and PartNumber of async Amazon S3 multi-part upload
我正在尝试使用此示例使用多部分上传将文件上传到Amazon S3。 我将List<UploadPartRequest>
更改为List<Task<UploadPartRequest>>
,然后在其满时调用Task.WaitAll(myList.ToArray)
。
唯一的事情是,当我将进度事件添加到每个UploadPartRequest
对象时,我无法弄清楚是哪一部分向我提供了信息(因为它们都同时反馈了!)。 我可以同步进行上传,并跟踪当前正在上传的PartNumber,但这并不理想,因为它显然要慢得多。
有人知道异步上传期间如何获取UploadPartRequest
的PartNumber
吗? 老实说,它看起来确实不像它( StreamTransferProgressArgs
没有信息,并且似乎是唯一的方法),但是我认为我会抛弃这个网络,看看我能抓到什么...
更新
这是我的代码段:
private void MultiPartUpload(string localUNC, string destinationUNC)
{
var uploadResponses = new List<UploadPartResponse>();
var initiateRequest = new InitiateMultipartUploadRequest
{
BucketName = _bucket,
Key = destinationUNC
};
var response = _s3.InitiateMultipartUpload(initiateRequest);
var contentLength = new FileInfo(localUNC).Length;
try
{
long filePosition = 0;
for (TotalParts = 1; filePosition < contentLength; )
{
TotalParts++;
filePosition += PartSize;
}
filePosition = 0;
for (CurrentPart = 1; filePosition < contentLength; )
{
var uploadRequest = new UploadPartRequest()
{
BucketName = _bucket,
Key = destinationUNC,
UploadId = response.UploadId,
PartNumber = CurrentPart,
PartSize = PartSize,
FilePosition = filePosition,
FilePath = localUNC
};
uploadRequest.StreamTransferProgress +=
new EventHandler<StreamTransferProgressArgs>(OnPartUploadProgressUpdate);
uploadResponses.Add(_s3.UploadPart(uploadRequest));
filePosition += PartSize;
CurrentPart++;
}
var completeRequest = new CompleteMultipartUploadRequest()
{
BucketName = _bucket,
Key = destinationUNC,
UploadId = response.UploadId
};
var completeResponse = _s3.CompleteMultipartUpload(completeRequest);
}
catch (Exception e)
{
Console.WriteLine("Error during multi-part upload: {0}", e.Message);
var abort = new AbortMultipartUploadRequest()
{
BucketName = _bucket,
Key = destinationUNC,
UploadId = response.UploadId
};
_s3.AbortMultipartUpload(abort);
}
}
委托函数是:
private static void OnPartUploadProgressUpdate(object sender, StreamTransferProgressArgs e)
{
//var obj = sender as AmazonS3Client;
//if (obj != null)
//{
Console.WriteLine(
"Part: {0} of {1} - {2:0.00}/{3:0.00}MB uploaded. {4}% complete.",
CurrentPart,
TotalParts,
ConvertByte.ToMegabyte(e.TransferredBytes),
ConvertByte.ToMegabyte(e.TotalBytes),
e.PercentDone);
//}
//else
//{
// Console.WriteLine(
// "{0}/{1}MB uploaded. {2}% complete.",
// ConvertByte.ToMegabyte(e.TransferredBytes),
// ConvertByte.ToMegabyte(e.TotalBytes),
// e.PercentDone);
//}
}
ConvertByte
类是我自己创建的。 我保留了注释掉的代码,因此您可以看到我尝试过的内容。
您可以将事件处理程序设为lambda,可以访问uploadRequest
局部变量:
uploadRequest.StreamTransferProgress +=
(_, e) => OnPartUploadProgressUpdate(uploadRequest, e);
…
static void OnPartUploadProgressUpdate(
UploadPartRequest request, StreamTransferProgressArgs e)
{
var partNumber = request.PartNumber;
…
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.