私のサーバーは、S3 への署名付きアップロードの情報を生成しています。その情報を iOS に渡すと、小さなファイルで機能します。より大きなものでも機能する場合がありますが、タイムアウトすることがよくあります。現在、WIFI経由でiOS 7でテストしています。約 35 MB のファイルで約 60% 後にタイムアウトするのが一般的ですが、完了する場合もあれば、それより早くタイムアウトする場合もあります。
私のサーバーは次の情報を生成し、フォーム パーツとして POST に渡します。(同様の結果が得られるパラメーターとしても試しました):
- AWSAccessKeyId
- コンテンツ タイプ
- acl (プライベートに設定)
- バケツ
- 鍵
- ポリシー
- サイン
- success_action_redirect
URLも同様です。
アップロードを生成するコードは次のとおりです。
AFHTTPRequestOperation *op = [manager POST:url
parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
{
if( throttle )
[formData throttleBandwidthWithPacketSize:kAFUploadStream3GSuggestedPacketSize delay:kAFUploadStream3GSuggestedDelay];
for( id key in parameters ) {
NSString *val = parameters[key];
[formData appendPartWithFormData:[val dataUsingEncoding:NSUTF8StringEncoding] name:key];
}
NSError *error;
if( ![formData appendPartWithFileURL:videoUrl name:@"file" fileName:@"movie.mov" mimeType:@"video/quicktime" error:&error] ) {
// handle the error
}
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
//success
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if( error.code == -1021 && !throttle ) {
//try again with throttle:
}
NSLog(@"Error: %@", error);
// handle error
}];
これにより、次のエラーが生成されます。
Error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x1aa15130 {NSErrorFailingURLStringKey=XXX, NSErrorFailingURLKey=XXX, NSLocalizedDescription=The request timed out., NSUnderlyingError=0x1ab94290 "The request timed out."}
アップデート:
SOにはいくつかの同様の質問があります。多くの人が Heroku のタイムアウトに問題を抱えていますが、私は S3 に直接アップロードしています。
この人物は、自分のサーバーへのアップロードで同じ問題を抱えているようです: - AFNetworking を使用して iOS に大きなファイルをアップロードする - エラー Request Timeout
この質問は、AWS ライブラリを使用した同様の問題のように見えますが、コードは提供されていません。
AFNetworking による Amazon-S3 へのアップロード
この問題は関連しているようですが、ソースを見ると、ファイルを投稿するときに長さが考慮されているようです:
https://github.com/AFNetworking/AFNetworking/issues/1510#issuecomment-29687300