Amazon S3 MultiPartUpload C#无法正常工作

时间:2018-08-08 20:17:45

标签: c# amazon-s3

我一直在努力解决这个问题,希望您能为我提供帮助。不知何故,我的编译器仅接受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)我尝试的每个回调都不起作用。预先感谢

2 个答案:

答案 0 :(得分:0)

万一其他人遇到相同的错误,我会完全更改代码并使用以下解决方案:https://github.com/aws/aws-sdk-net/issues/562

答案 1 :(得分:0)

您可以这样启动它:

            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);
                  }
              });