1

NSMutableURLRequestでsetHTTPBodyの代わりにsetHTTPBodyStreamを使用すると問題が発生します。

私はhttppostを介してサーバーに大きなファイルを送信するコードに取り組んでいます。次の部分コードを使用すると、すべてが完全に機能します。

NSData * mydata = [NSData dataWithContentsOfFile:self.tmpFileLocationToUpload];
[request setHTTPBody:mydata];

私がそれをに変更した場合:

NSData * mydata = [NSData dataWithContentsOfFile:self.tmpFileLocationToUpload];
self.tmpInputStream = [NSInputStream inputStreamWithData:mydata];
[request setHTTPBodyStream: self.tmpInputStream];

その後、私は常にネットワークエラーで終了します:エラー-操作を完了できませんでした。(kCFErrorDomainCFNetworkエラー303。)

最後に、ファイルから直接inputStremを作成して、大きなファイルをメモリにロードせずに送信できるようにすることが目標です。

setHTTPBodyStreamを使用して何かを見逃しましたか?

ご協力いただきありがとうございます。

よろしく。セバスチャン。

4

2 に答える 2

1

を使用すると、リクエストのヘッダーがsetHTTPBody自動的に設定されますが、 を使用すると、そうではなく、. 転送エンコーディングは、ストリームの長さが事前に判断できない場合に使用されます。(チャンク転送エンコーディングを参照してください。)Content-lengthsetHTTPBodyStreamTransfer-encodingchunkedchunked

NSURLConnectionと組み合わせて使用​​する場合setHTTPBodyStreamは、手動で設定することができ、これにより のContent-lengthが防止されます (事前に長さがわかっている場合)。Transfer-encodingchunked

NSString *contentLength = [NSString stringWithFormat:@"%d", [mydata length]];
[request setValue:contentLength forHTTPHeaderField:@"Content-length"];

を使用する場合、チャンク化されたリクエストと組み合わせてNSURLSession手動で設定しようとすると、リクエストになるのを防げない場合があります。Content-lengthchunked

于 2014-01-09T18:45:46.007 に答える
1

HTTP メソッドを設定してみてください (まだ設定していない場合)。以下を追加することで、「kCFErrorDomainCFNetwork エラー 303」エラーを修正できました。

[request setHTTPMethod:@"POST"];
于 2012-04-10T11:38:12.060 に答える