使用ASP.NET将异步分段上传到Amazon S3

时间:2013-10-09 05:26:34

标签: asp.net .net asynchronous amazon-s3 multipart

我能够启动到S3的异步上传,但是它们在某种程度上不会作为我的S3存储桶中的文件结束而且我看到错误'WithPartETags不能为空'。这是完整的代码

InitiateMultipartUploadRequest initRequest =
    new InitiateMultipartUploadRequest()
    .WithBucketName(existingBucketName)
    .WithKey(Path.Combine(S3Path + "/", finfo.Name));

InitiateMultipartUploadResponse initResponse =
    s3Client.InitiateMultipartUpload(initRequest);

// 2. Upload Parts.
long contentLength = finfo.Length;
long partSize = 15728640;//52428800-50MB 104857600- 100 MB - 5242880 - 5 MB
try
{
    long filePosition = 0;
    for (int i = 1; filePosition < contentLength; i++)
    {

        // Create request to upload a part.
        UploadPartRequest uploadRequest = new UploadPartRequest()
            .WithBucketName(existingBucketName)
            .WithKey(Path.Combine(S3Path + "/", finfo.Name))
            .WithUploadId(initResponse.UploadId)
            .WithPartNumber(i)
            .WithPartSize(partSize)
            .WithFilePosition(filePosition)
            .WithFilePath(finfo.FullName);

        // Upload part and add response to our list.
        //uploadResponses.Add(s3Client.UploadPart(uploadRequest));

        IAsyncResult ar = s3Client.BeginUploadPart(uploadRequest, null, null);
        ListObj.Add(new ThreadList() { _iasyncResult = ar });

        filePosition += partSize;
        Console.WriteLine("Length Written - " + filePosition + " .Content Length - " + contentLength);
    }

    bool uploadsComplete = false;
    while (!uploadsComplete)
    {
        bool individualuploadscomplete = true;
        foreach (var obj in ListObj)
        {
            if (!obj._iasyncResult.IsCompleted)
            {
                individualuploadscomplete = false;
                break;
            }

        }
        if (individualuploadscomplete)
        {
            uploadsComplete = true;
        }
    }

    foreach (var obj in ListObj)
    {
        s3Client.EndUploadPart(obj._iasyncResult);
    }

    //// Step 3: complete.
    CompleteMultipartUploadRequest compRequest =
        new CompleteMultipartUploadRequest()
        .WithBucketName(existingBucketName)
        .WithKey(Path.Combine(S3Path + "/", finfo.Name))
        .WithUploadId(initResponse.UploadId);
        //.WithPartETags(uploadResponses);

    CompleteMultipartUploadResponse completeUploadResponse =
        s3Client.CompleteMultipartUpload(compRequest);

1 个答案:

答案 0 :(得分:2)

不确定为什么您为完整的分段上传调用注释了PartETags的设置,但您需要重新添加该代码。此外,当您调用EndUploadPart方法时,您需要捕获从那里回来的UploadResponse

您可能还想查看Amazon.S3.Transfer命名空间中的TransferUtility。它的上传方法旨在处理您尝试为大型对象完成的操作,有关详细信息和示例代码段,请参阅Using the High-Level .NET API for Multipart Upload

相关问题