首页 > 解决方案 > Amazon S3 MultiPartUpload C# 不工作

问题描述

我已经为这个问题苦苦挣扎了几个小时,希望你能帮助我。不知何故,我的编译器只接受 InitiateMultipartUploadAsync 而不是常规的 InitiateMultipartUpload 并且绝对需要回调作为编译参数,但我可以弄清楚给他什么回调函数。

private static async Task UploadObjectAsync()
{
    // Create list to store upload part responses.
    List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();
    // Setup information required to initiate the multipart upload.
    InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest
    {
        BucketName = "XXXXXXXXX",
        Key = "videos/multipart"
    };

    // Initiate the upload.

    InitiateMultipartUploadResponse initResponse =
        await S3Client.InitiateMultipartUploadAsync(initiateRequest);

    // Upload parts.
    long contentLength = new FileInfo("videotest").Length;
    long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB

    try
    {
        Console.WriteLine("Uploading parts");

        long filePosition = 0;
        for (int i = 1; filePosition < contentLength; i++)
        {
            UploadPartRequest uploadRequest = new UploadPartRequest
            {
                BucketName = "XXXXXXXX",
                Key = "videos/multipart",
                UploadId = initResponse.UploadId,
                PartNumber = i,
                PartSize = partSize,
                FilePosition = filePosition,
                FilePath = "videotest"
            };

            // Track upload progress.
            uploadRequest.StreamTransferProgress +=
                new EventHandler<StreamTransferProgressArgs>(UploadPartProgressEventCallback);

            // Upload a part and add the response to our list.
            uploadResponses.Add(await S3Client.UploadPartAsync(uploadRequest));

            filePosition += partSize;
        }

        // Setup to complete the upload.
        CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest
        {
            BucketName = "XXXXXXXXXXX",
            Key = "videos/multipart",
            UploadId = initResponse.UploadId
        };
        completeRequest.AddPartETags(uploadResponses);

        // Complete the upload.

        CompleteMultipartUploadResponse completeUploadResponse =
            await S3Client.CompleteMultipartUploadAsync(completeRequest);
    }
    catch (Exception exception)
    {
        Console.WriteLine("An AmazonS3Exception was thrown: {0}", exception.Message);

        // Abort the upload.
        AbortMultipartUploadRequest abortMPURequest = new AbortMultipartUploadRequest
        {
            BucketName = "XXXXXXXXX",
            Key = "videos/multipart",
            UploadId = initResponse.UploadId
        };
        await S3Client.AbortMultipartUploadAsync(abortMPURequest);
    }
}
public static void UploadPartProgressEventCallback(object sender, StreamTransferProgressArgs e)
{
    // Process event. 
    Console.WriteLine("{0}/{1}", e.TransferredBytes, e.TotalBytes);
}

这段代码的灵感来自官方的 aws 示例:https ://docs.aws.amazon.com/AmazonS3/latest/dev/LLuploadFileDotNet.html 所以我真的不明白为什么这不起作用!目前使用上面的代码,Visual Studio 告诉我 InitiateMultipartUploadAsync、UploadPartAsync、CompleteMultipartUploadAsync 和 AbortMultipartUploadAsync 都需要回调函数,但是 1)示例说回调是可选的 2)我尝试的每个回调都不起作用。提前致谢

标签: c#amazon-s3

解决方案


你可以像这样启动它:

            s3Client = new AmazonS3Client(BUCKETREGION);
            var initiateRequest = new InitiateMultipartUploadRequest { BucketName = BUCKET, Key = KEY };

            await s3Client.InitiateMultipartUploadAsync(initiateRequest).ContinueWith(response =>
              {
                  if (!string.IsNullOrEmpty(response.Result.UploadId))
                  {
                      uploadId = response.Result.UploadId;
                  }
                  else
                  {
                      Debug.WriteLine(response.Exception);
                  }
              });

推荐阅读