2012-10-11 49 views
0

我试图使用Amazon sdk for MAC上传一个巨大的文件(8GB)(虽然它们没有用于MAC的sdk,但我通过删除了该文件来修改了IOS sdk源代码UIKit参考并重新编译为MAC)。它实际上可以用于文件,可能高达800MB〜1GB。但每当我尝试上传8GB文件时,我都会遇到异常情况。例外说“互联网连接丢失”。奇怪,我有良好的互联网连接(2Mbps上传速度: - /)。我正在使用分段上传api并上传5MB大块。当我遇到异常时,我不会放弃,但我会重试同一块至少5次,然后放弃。在这次重试之间,我睡了几秒钟。但最让人吃惊的部分是,一旦块上传面临异常,它将不会再重试。我不明白。谁能帮我吗????S3上传程序在尝试上传大文件时抛出异常

在此先感谢!

下面我加入代码!

 fileHandle = [NSFileHandle fileHandleForReadingAtPath:filePath]; 

     S3InitiateMultipartUploadRequest* initReq = [[S3InitiateMultipartUploadRequest alloc] initWithKey:requestDetails.md5 inBucket:requestDetails.bucket]; 
     initReq.contentType = requestDetails.contentType; 

     S3MultipartUpload* upload = [amazonS3Client_ initiateMultipartUpload:initReq].multipartUpload; 
     S3CompleteMultipartUploadRequest* compReq = [[S3CompleteMultipartUploadRequest alloc] initWithMultipartUpload:upload]; 


     compReq.contentType = requestDetails.contentType; 

     NSData* data = [fileHandle readDataOfLength:PART_SIZE]; 
     int part = 0; 
     ............................... 
     while([data length] > 0) 
     { 
       @try { 
        S3UploadPartRequest* upReq = [[S3UploadPartRequest alloc] initWithMultipartUpload:upload]; 
        upReq.partNumber = part + 1; 
        upReq.contentLength = data.length; 
        upReq.data = data; 
        upReq.contentType = requestDetails.contentType; 

        response = [amazonS3Client_ uploadPart:upReq]; 
        [compReq addPartWithPartNumber:(part + 1) withETag:response.etag]; 

        offset += [data length]; 

        [fileHandle seekToFileOffset:offset]; 
        data = [fileHandle readDataOfLength:PART_SIZE]; 
        part++; 
        ........................ 
       } 
       @catch (AmazonClientException *exception) { 
        ............................. 

        if([exception.message rangeOfString:@"expire"].location != NSNotFound) 
        { 
         // renew credentials code 
         return [self multipartUpload:requestDetails withFilePath:filePath]; 
        } 

       } 
      } 
     [amazonS3Client_ completeMultipartUpload:compReq]; 

回答

2

我是AWS SDK for iOS的维护者之一。虽然我们还没有测试过这种大小的文件,但我想不出任何会导致此问题的SDK。你可能想有些事情尝试和/或包含在你的问题:

  1. AWS的SDK iOS版的最新版本包括一个选项,从SDK本身禁用例外。这可能会显示异常的来源是在SDK还是其他地方。

  2. 你说你正在重试异常,但你重新使用请求或创建一个新的?包括你的代码可能会帮助他人提供建议。

  3. 当你进入这个状态时,你可以执行任何其他的操作吗?你确定你没有导致你的网络连接以某种方式重置吗?

跟进

我花了相当多的时间试图再现与最新版本的SDK AWS的适用于iOS在过去几天的问题,都没有成功。我能够使用分段上传将10GB文件成功上传到Amazon S3。

我想总结一些研究结果并给出一些建议的后续步骤:

  1. 你真的应该更新的SDK。自称您下载后的6个月内,针对iOS的AWS软件开发工具包进行了多次更新,其中一些涉及连接处理,可能有助于解决此问题。

  2. 您对互联网连接的测试可能不是正确的测试。你没有包括这个代码,所以目前还不清楚,但是如果你所测试的只是本地设备有链接并且能够到达它们的网关,那么这并不一定是一个有效的指示,说明你的系统没有问题连接到Amazon S3。您得到超时(稍后更多)的事实表明您的计算机出现问题连接到Amazon S3。出现这种情况的原因很多,包括网络硬件故障或ISP的显式流量整形。

  3. SDK在超时处理方面存在不一致。对于除S3之外的所有客户端,超时将应用于NSURLConnection对象以及处理实际请求。对于S3,它仅适用于处理请求,意味着NSURLConnection timeoutInverval属性未经修改。 NSURLConnection的timeoutInterval属性是一个超时到建立的连接。一旦数据被发送或接收,即使它只是滴流,NSURLConnection也不会超时。这意味着如果您收到超时例外,则计算机无法建立与默认timeoutInterval(60秒)的Amazon S3连接。我们会审查并修补SDK以解决此不一致问题。

  4. 正如我在我的原始答案中所述,最好确认是否可以向Amazon S3发出另一个请求(如列表桶/对象),以及在您遇到其他外部资源时进入这种失败状态。这至少可以让你访问你的ISP并提出更好的问题。

希望这个信息能帮助

+0

感谢您的答复!我粘贴了上面的代码。你可以通过它。回到你的问题1:我可能会使用旧版本。我下载了6分之一秒。 2:每次重试都会创建一个新的请求。你可以在代码中看到它。 3:当我发现异常时,我很确定我有联系。还有一点要注意的是,对于大文件,我也会得到另一个例外。它说'请求超时',虽然我已将'INT_MAX'设置为超时值:-o – Advaith

+0

要清楚:是否是上传部件请求或您检查互联网连接的例外情况? –

+0

@Advaith对不起,要求提供更多信息,但是如果您可以包含来自AmazonLogger的额外日志记录,这可能也有助于诊断问题。我同意奇怪的是,你会得到如此大的价值超时。您肯定是以不在我们支持的用例范围内的方式来使用SDK,但我们会看看我们能否提供帮助。 –

相关问题