繁体   English   中英

进度信息和异步Amazon S3分段上传的PartNumber

[英]progress information and PartNumber of async Amazon S3 multi-part upload

我正在尝试使用此示例使用多部分上传将文件上传到Amazon S3。 我将List<UploadPartRequest>更改为List<Task<UploadPartRequest>> ,然后在其满时调用Task.WaitAll(myList.ToArray)

唯一的事情是,当我将进度事件添加到每个UploadPartRequest对象时,我无法弄清楚是哪一部分向我提供了信息(因为它们都同时反馈了!)。 我可以同步进行上传,并跟踪当前正在上传的PartNumber,但这并不理想,因为它显然要慢得多。

有人知道异步上传期间如何获取UploadPartRequestPartNumber吗? 老实说,它看起来确实不像它( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM