0

Mac用のAmazonsdkを使用して巨大なファイル(8GB)をアップロードしようとしました(MAC用のsdkはありませんが、UIKit参照を削除してIOS sdkソースコードを変更し、MAC用に再コンパイルしました)。それは実際にはファイルに対して機能しており、おそらく最大800MB〜1GBです。しかし、8GBのファイルをアップロードしようとすると、例外が発生します。例外は「インターネット接続が失われた」ということです。奇妙なことに、私はインターネット接続が良好です(2Mbpsのアップロード速度:-/)。マルチパートアップロードAPIを使用しており、5MBのチャンクをアップロードしています。例外が発生した場合、私はあきらめていませんが、同じチャンクを少なくとも5回再試行してから、あきらめます。この再試行の間に、私は数秒間眠っています。しかし、最も驚くべき部分は、チャンクのアップロードが例外に直面すると、再試行では実際には機能しないことです。わかりません。誰かが私を助けることができますか????

前もって感謝します!

以下もコードを追加しています!

        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];
4

1 に答える 1

2

私はAWSSDKforiOSのメンテナーの1人です。そのサイズのファイルでテストしたことはありませんが、SDKでこれを引き起こすものは何も考えられません。あなたが試してみたい、および/またはあなたの質問に含めたいと思うかもしれないいくつかのこと:

  1. AWS SDK for iOSの最新バージョンには、SDK自体からの例外を無効にするオプションが含まれています。これは、例外のソースがSDKにあるのか他の何かにあるのかを示している可能性があります。

  2. 例外で再試行していると言いますが、リクエストを再利用していますか、それとも新しいリクエストを作成していますか?コードを含めると、他の人が提案を提供するのに役立つ場合があります。

  3. この状態になったとき、他の操作を実行できますか?何らかの方法でネットワーク接続をリセットしていないことを確認しますか?

ファローアップ

過去数日間、iOS用のAWS SDKの最新バージョンで問題を再現するためにかなりの時間を費やしましたが、成功していません。マルチパートアップロードを使用して、10GBのファイルをAmazonS3に正常にアップロードできました。

いくつかの調査結果を要約し、次のステップのためのいくつかの推奨事項を示したいと思いました。

  1. 本当にSDKを更新する必要があります。ダウンロードしたと言ってから6か月間、AWS SDK for iOSには多くの更新があり、接続処理に関連するものもあり、この問題に役立つ可能性があります。

  2. インターネット接続のテストでは、正しいテストが行​​われていない可能性があります。このためのコードを含めなかったため、不明ですが、テストしているのがローカルデバイスにリンクがあり、ゲートウェイに到達できることだけである場合、それは必ずしも問題がないことを示す有効な指標ではありません。 AmazonS3への接続。タイムアウトが発生したという事実(これについては後で詳しく説明します)は、コンピューターにAmazonS3への接続に問題があったことを示しています。ネットワークハードウェアの障害やISPによる明示的なトラフィックシェーピングなど、これが発生する可能性のある理由はいくつかあります。

  3. タイムアウト処理に関して、SDKに不整合があります。S3以外のすべてのクライアントの場合、タイムアウトはNSURLConnectionオブジェクトに適用され、実際のリクエストを処理します。S3の場合、これはリクエストの処理にのみ適用されます。つまり、NSURLConnectiontimeoutInvervalプロパティは変更されません。NSURLConnection timeoutIntervalプロパティは、接続を確立するためのタイムアウトです。データが送受信されると、たとえそれがほんのわずかであっても、NSURLConnectionはタイムアウトしません。これは、タイムアウト例外を受け取っている場合、コンピューターがデフォルトのtimeoutInterval(60s)でAmazonS3への接続を確立できなかったことを意味します。この不整合に対処するために、必要に応じてSDKを確認してパッチを適用します。

  4. 私の元の回答で述べたように、この失敗状態に陥ったときに、Amazon S3(リストバケット/オブジェクトなど)に別のリクエストを送信できるかどうかを確認し、google.comなどの別の外部リソースにアクセスできるかどうかを確認するとよいでしょう。 。これにより、少なくともISPにアクセスして、何が起こっているのかについてより良い質問をすることができます。

この情報がお役に立てば幸いです

于 2012-10-11T16:56:44.300 に答える