以下のコードを使用して、ファイルをサーバーに送信します。
NSString *urlString = [NSString stringWithFormat:@"%@%@",[LIUtility sharedUtility].uploadConnectionURL,BR_SERVER_UPLOAD_ADDRESS_FILE];
self.request =[[NSMutableURLRequest alloc] init];
[self.request setURL:[NSURL URLWithString:urlString]];
[self.request setHTTPMethod:@"POST"];
PKMultipartInputStream *body = [[PKMultipartInputStream alloc] init];
NSString *requestString =[self getRequestStringForRange:range andExtension:fileName];
NSData *requestData = [requestString dataUsingEncoding:NSUTF8StringEncoding];
NSString *jsonLengthString = [NSString stringWithFormat:@"%04lu",(unsigned long)requestData.length];
NSData *jsonLengthData = [jsonLengthString dataUsingEncoding:NSUTF8StringEncoding];
[body addPartWithName:@"jsonLength" data:jsonLengthData];
[body addPartWithName:@"json" data:requestData];
[body addPartWithName:@"separator" string:@"\r\n"];
[body addPartWithName:@"fileData" filename:fileName stream:dataStream streamLength:streamSize];
[self.request setHTTPBodyStream:body];
[self.request setTimeoutInterval:60];
NSString *contentType = LI_CONNECTION_CONTENTTYPE;
[self.request addValue:contentType forHTTPHeaderField: @"Content-Type"];
self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self];
_responseData = [NSMutableData data];
[self.connection start];
ファイルが3G/4Gでアップロードされています。デバイスが一部のADSL ISPのwifiに接続されている場合でもコードは機能しますが、他の一部のISPではコードが機能せず、以下のエラーが発生します。
エラードメイン= NSURLErrorDomainコード= -1001「要求がタイムアウトしました。」 UserInfo = {NSErrorFailingURLStringKey = http://example.net 、_kCFStreamErrorCodeKey = -2102、NSErrorFailingURLKey = http:/example.net:80/au、NSLocalizedDescription =リクエストがタイムアウトしました。、_kCFStreamErrorDomainKey = 4、 NSUnderlyingError = 0x16a40410 {エラードメイン= kCFErrorDomainCFNetworkコード= -1001「リクエストがタイムアウトしました。」 UserInfo = {_ kCFStreamErrorCodeKey = -2102、NSErrorFailingURLStringKey = http://example.net 、NSErrorFailingURLKey = http://example.net 、NSLocalizedDescription =リクエストがタイムアウトしました、 _kCFStreamErrorDomainKey = 4}}}
誰が問題なのかについて何か考えがありますか?
リクエストにContent-Length
を追加して、ようやく問題を解決しました。
Content-Length
ヘッダーをリクエストに追加しない場合、NSURLConnection
はそれをchunked
リクエストとして送信しますが、そのような問題はチャンクリクエストでよくあるようです。
実際、私はこのchunked
リクエストで問題の根本的な原因を見つけられませんでした(私はWebで多くの主題を検索し、多くの記事を読んだり、他のいくつかのプログラマーと話したが、根本的な原因を見つけなかったので、使用することにしました他のソリューション)が、私はこのソリューションをビジネスでチャンク化されていないリクエストを使用できる誰かのために共有しました。チャンクリクエストのほとんどの使用はリアルタイムストリーミングであり、Content-Length
がわからないため、Content-Length
を追加できる場合は、このようなチャンクの問題を回避するために使用することをお勧めします。
エンタープライズバージョンのアプリケーションを実行している場合は、サーバー管理者に問い合わせて、証明書が最新であり、ファイアウォールサーバーと互換性があるかどうかを確認してください。私はそうではありません。