2013-01-10 65 views
2

我正在嘗試使用Amazon S3 SDK將部分大文件上傳到S3服務器。我有以下代碼:Amazon S3 uploadPart returns null

-(void)multipartUpload:(NSData*)dataToUpload inBucket:(NSString*)bucket forKey:(NSString*)key 
{ 
    //bool using3G = ![self isWifiAvailable]; 

    AmazonS3Client *s3 = [[AmazonS3Client alloc] initWithAccessKey:kS3ApplicationKey withSecretKey:kS3ApplicationSecret]; 

    s3.timeout = 99999999; 

    @try { 
     //[s3 createBucketWithName:bucket]; 

     S3InitiateMultipartUploadRequest *initReq = [[S3InitiateMultipartUploadRequest alloc] initWithKey:key inBucket:bucket]; 
     S3MultipartUpload *upload = [s3 initiateMultipartUpload:initReq].multipartUpload; 
     S3CompleteMultipartUploadRequest *compReq = [[S3CompleteMultipartUploadRequest alloc] initWithMultipartUpload:upload]; 

     int numberOfParts = [self countParts:dataToUpload]; 


     for (int part = 0; part < numberOfParts; part++) { 
      NSLog(@"%d", part); 

      NSData *dataForPart = [self getPart:part fromData:dataToUpload]; 

      // The S3UploadInputStream was deprecated after the release of iOS6. 
      NSInputStream *stream = [NSInputStream inputStreamWithData:dataForPart]; 

      S3UploadPartRequest *upReq = [[S3UploadPartRequest alloc] initWithMultipartUpload:upload]; 
      upReq.partNumber = (part + 1); 
      upReq.contentLength = [dataForPart length]; 
      upReq.stream = stream; 
      upReq.delegate = self; 

      S3UploadPartResponse *response = [s3 uploadPart:upReq]; // <----- null returned here :(
      [compReq addPartWithPartNumber:(part + 1) withETag:response.etag]; 
     } 

     [s3 completeMultipartUpload:compReq]; 
    } 
    @catch (AmazonServiceException *exception) { 
     NSLog(@"Multipart Upload Failed, Reason: %@", exception ); 
    } 
    @catch (NSException *exception) { 
     NSLog(@"Other exception %@", exception); 
    } 
} 

問題是uploadPart方法返回null而不是實際的服務器響應,這會導致下一行出現異常。

我已經實現了所有委託方法來檢查錯誤,但沒有任何報告。

的代碼是從這裏複製:http://aws.amazon.com/articles/0006282245644577

任何想法,爲什麼它不工作?

+0

有什麼理由降低了這個問題? –

+0

有無論如何重新上傳失敗的部分?考茨可以說,如果上網過程中互聯網連接失敗,如何重新恢復? –

回答

3

uploadPart方法返回nil,因爲您爲S3UploadPartRequest對象設置了delegate屬性。您需要在request:didCompleteWithResponse:委託方法中檢索response.etag,或者在沒有委託的情況下使用同步調用。 AWS開發人員博客解釋瞭如何正確使用AmazonServiceRequestDelegatehttp://mobile.awsblog.com/post/Tx2XVU3IRV1HBOJ/Using-the-AWS-SDK-for-iOS-Asynchronously-Part-I-Sync-vs-Async

+0

哇!而已!謝謝! :) –

+0

是否有可能仍然異步使用MultipartUpload? –

+1

這是可能的,但您需要跟蹤所有Etags,並且只有在所有部件上載成功完成後才調用completeMultipartUpload。 –