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