2013-10-29 201 views
1

我有一个应用程序,我想将s3中存在的两个文件合并到第三个文件中。我想使用复制对象使用分段上传。以下是代码。在S3上合并文件亚马逊

 AmazonS3Config config = new AmazonS3Config(); 
     AmazonS3 s3Client = new AmazonS3Client(accessKeyID, secretAccessKey, config); 

     // List to store upload part responses. 
     List<UploadPartResponse> uploadResponses = 
      new List<UploadPartResponse>(); 

     List<CopyPartResponse> copyResponses = 
        new List<CopyPartResponse>(); 
     InitiateMultipartUploadRequest initiateRequest = 
       new InitiateMultipartUploadRequest() 
       .WithBucketName(targetBucket) 
       .WithKey(targetObjectKey); 

     InitiateMultipartUploadResponse initResponse = 
      s3Client.InitiateMultipartUpload(initiateRequest); 
     String uploadId = initResponse.UploadId; 

     try 
     { 
      // Get object size. 
      GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(); 
      metadataRequest.BucketName = sourceBucket; 
      metadataRequest.Key = sourceObjectKey1; 

      GetObjectMetadataResponse metadataResponse = s3Client.GetObjectMetadata(metadataRequest); 
      long objectSize1 = metadataResponse.ContentLength; // in bytes 

      // Get object size. 
      GetObjectMetadataRequest metadataRequest2 = new GetObjectMetadataRequest(); 
      metadataRequest2.BucketName = sourceBucket; 
      metadataRequest2.Key = sourceObjectKey2; 

      GetObjectMetadataResponse metadataResponse2 = s3Client.GetObjectMetadata(metadataRequest2); 
      long objectSize2 = metadataResponse2.ContentLength; // in bytes 

      long bytePosition = 0; 


      CopyPartRequest copyRequest1 = new CopyPartRequest() 
       .WithDestinationBucket(targetBucket) 
       .WithDestinationKey(targetObjectKey) 
       .WithSourceBucket(sourceBucket) 
       .WithSourceKey(sourceObjectKey1) 
       .WithUploadID(uploadId) 
       .WithFirstByte(bytePosition) 
       .WithLastByte(objectSize1 - 1) 
       .WithPartNumber(1); 

      copyResponses.Add(s3Client.CopyPart(copyRequest1)); 


      CopyPartRequest copyRequest2 = new CopyPartRequest() 
       .WithDestinationBucket(targetBucket) 
       .WithDestinationKey(targetObjectKey) 
       .WithSourceBucket(sourceBucket) 
       .WithSourceKey(sourceObjectKey2) 
       .WithUploadID(uploadId) 
       .WithFirstByte(bytePosition) 
       .WithLastByte(objectSize2 - 1) 
       .WithPartNumber(2); 

      copyResponses.Add(s3Client.CopyPart(copyRequest2)); 

      //// 
      CompleteMultipartUploadRequest completeRequest = 
        new CompleteMultipartUploadRequest() 
        .WithBucketName(targetBucket) 
        .WithKey(targetObjectKey) 
        .WithUploadId(initResponse.UploadId) 
        .WithPartETags(GetETags(copyResponses)); 

      CompleteMultipartUploadResponse completeUploadResponse = 
       s3Client.CompleteMultipartUpload(completeRequest); 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 

但它在最后一行CompleteMultipartUpload抛出异常。以下是S3异常:您的建议上传量小于允许的最小尺寸

其中,我似乎只上传了copyRequest1,它工作正常。

任何帮助表示赞赏!

问候, Haseena

+0

它可以完成,但合并的文件必须至少有5MB。请参阅http://stackoverflow.com/questions/19634555/multipart-upload-error-in-c-sharp –

回答

0

你设法解决这个问题?看起来它不能使用S3 api来完成

+0

是的,它不能使用s3 api完成,所以我使用FTP下载和合并。 –

0

无法使用S3 API合并上传的文件,所以我使用FTP来下载和合并。