5

NSURLConnection を使用して、非同期 HTTPS POST を Web サービスに作成し、jpg をアップロードしています。ほとんどの場合、正常に動作します。

しかし、投稿本文が 196609 ~ 196868 バイト (両端を含む) の場合、ファイルが 100% アップロードされた後に接続がハングします (didSendBodyData は、100% 送信されたことを示しています)。その後 5 分後に、「ネットワーク接続が失われました」というメッセージが表示されて接続がタイムアウトします。大きいファイルサイズも小さいファイルサイズも機能します。投稿本文に追加するファイルのファイルサイズを制限して、これをテストしました。

コンテンツの長さが正しく設定されています。以下のコードを参照してください。

HTTP経由でnetcatにアップロードすると、アップロードは問題ないように見えます。メッセージの本文全体が通過します。しかし、SSL 暗号化ブロック フレームをバッファリングしているなど、SSL 暗号化が原因で何か問題が発生していると思われます。

iPhone の SSL コードにバグがあり、投稿の本文全体がアップロードされていると報告されているにもかかわらず、アップロードされないことがありますか?

これは、コンテンツの長さを設定し、マルチパート POST 本文にファイルを追加するセクションです。テストのために、ファイルサイズを手動で制限していることがわかります。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:nsurl];
[request setHTTPMethod:@"POST"];
[request setTimeoutInterval:1];
[request addValue:@"close" forHTTPHeaderField: @"Connection"];

// Add headers and POST information
NSLog( @"Posting file." );
NSString *stringBoundary = [NSString stringWithString:@"0xKhTmLbOuNdArY"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *postBody = [NSMutableData data];

...

[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"uploadFile\"; filename=\"upload.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithString:@"Content-Type: image/jpg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
NSLog( @"file size...%d", [uploadFile length] );
//[postBody appendData:uploadFile];
[postBody appendData:[NSData dataWithBytes: [uploadFile bytes] length: 196099]];
[postBody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:postBody];
[request setValue:[NSString stringWithFormat:@"%d", [postBody length]] forHTTPHeaderField:@"Content-Length"];
NSLog(@"Uploaded POST size: %d", [postBody length] );
4

3 に答える 3

3

ああ、私は問題が何であるかを発見しました。Connection: close を設定したにもかかわらず、Connection: Keep-alive が設定されています。これをオーバーライドするにはどうすればよいですか?? できないみたい!?

于 2010-12-08T08:25:42.167 に答える
1

このコード行を削除してみてください。

[request addValue:@"close" forHTTPHeaderField: @"Connection"];

httpサーバーにこの接続を閉じるように指示します。RFC 2616(HTTP / 1.1)により、サーバーとクライアントは持続的接続を維持する必要があります。

于 2010-12-08T07:49:16.770 に答える
1

30 ~ 40 MB のファイルに対してテストされた次のコードがあり、ハングすることはありません。あなたのコードとほぼ同じように見えますが、何かを待っているのはサーバー側のスクリプトではないのでしょうか?

url = [NSURL URLWithString:u];

NSData* d = [self data];

request = [NSMutableURLRequest requestWithURL:url];
[request setTimeoutInterval: 2000 ];
[request setHTTPMethod:@"POST"];
[request setValue:
 [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BOUNDRY]
forHTTPHeaderField:@"Content-Type"];

NSMutableData *postData =
[NSMutableData dataWithCapacity:[d length] + 512];
[postData appendData:
 [[NSString stringWithFormat:@"--%@\r\n", BOUNDRY] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:
 [[NSString stringWithFormat:
   @"Content-Disposition: form-data; name=\"%@\"; filename=\"file.bin\"\r\n\r\n", FORM_FLE_INPUT]
  dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:d];
[postData appendData:
 [[NSString stringWithFormat:@"\r\n--%@--\r\n", BOUNDRY] dataUsingEncoding:NSUTF8StringEncoding]];

[request setHTTPBody:postData];
于 2010-12-08T07:18:49.410 に答える