4

ファイルからのストリームとしての http PUT 要求と要求本文に問題があります。

ファイルのサイズに関係なく、「NSURLErrorDomain -1021リクエストボディストリームが使い果たされました」というエラーが表示されます

メソッドを実装することで、この問題をオーバーライドできることはわかっています。

-(NSInputStream*)connection:(NSURLConnection *)connection needNewBodyStream:(NSURLRequest *)request

しかし、この方法はファイル全体を再度アップロードすることになり、40 MB のファイルが 80 Mb のデータ転送になるため、適切ではありません。

NSData と同じファイルを取得してリクエスト本文を設定すると、正常に動作します。

リクエスト Async を送信して、両方で同じ結果を同期しようとしました。

これが私のコードで、シンプルでAppleの例に似ています:

NSURL *url = [NSURL URLWithString:[self concatenatedURLWithPath:path]];
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL:url];
[req setHTTPMethod:@"PUT"];
[req setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setTimeoutInterval:DEFAULT_TIMEOUT];
[req setValue:_contentType forHTTPHeaderField:@"Content-Type"];
NSInputStream *fileStream = [NSInputStream inputStreamWithFileAtPath:_dataStreamLocation];

[req setHTTPBodyStream:fileStream];
_connection = [[NSURLConnection connectionWithRequest:req delegate:self] retain];

私は何か間違ったことをしていますか?何か不足していますか?

4

2 に答える 2

2

見た目から、ヘッダーに @"Content-Length" を設定していないようです。

私がそれを行う方法は次のとおりです。

NSUInteger fileSize = [[[[NSFileManager defaultManager] attributesOfItemAtPath:_dataStreamLocation error:nil] objectForKey:NSFileSize] unsignedIntegerValue];
[request setValue:[NSString stringWithFormat:@"%u", fileSize] forHTTPHeaderField:@"Content-Length"];

いずれにせよ、バッチアップロードを行っていて、ボディストリームの枯渇エラーが時々発生しました。私が知る限り、問題はデバイスに空き容量がほとんどなく、いくつかのアップロードが完了する前に一時ファイルが自動的に削除されることでした (エラーを受け取ったときに、ファイルがまだそこにあるかどうかを確認するためにテストし、そうではありませんでした)。

于 2013-01-21T13:17:47.800 に答える
1

私はこの同じ問題に遭遇していました。それを修正したのは、ストリームを保持し、非同期 HTTP トランザクションの最後に解放することでした。これが必要なようには思えませんが、問題を回避できました。

于 2011-01-27T22:37:41.463 に答える