2013-10-09 33 views
1

我能夠啓動異步上傳到S3,但他們不知道如何不作爲我的S3桶內的文件結束,我看到一個錯誤'WithPartETags不能爲空' 。下面是完整的代碼異步分段上傳到亞馬遜S3與ASP.NET

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

回答

2

不知道爲什麼你有註釋掉了完整的多載通話PartETags的設置,但你需要添加代碼回。此外,當您所呼叫的EndUploadPart方法需要捕捉那個從那回來的UploadResponse

您還可能想要查看Amazon.S3.Transfer命名空間中的TransferUtility。其上傳方法旨在處理您嘗試爲大型對象完成的操作,有關詳細信息和示例代碼段,請參閱Using the High-Level .NET API for Multipart Upload