2012-10-11 73 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,但我們會看看我們能否提供幫助。 –

相關問題