4

http PUTリクエストとリクエスト本文がファイルからのストリームとして問題があります。NSMutableURLRequestと「要求されたボディストリームが枯渇しました」エラー

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

が、このアプローチを:どんなに私はこの方法を実施することにより、この問題を上書きすることができます知っているファイルのサイズが、私はエラーを取得する「NSURLErrorDomain -1021リクエストボディストリーム枯渇」

もう一度ファイル全体をアップロードするとうまくいかず、40 MBのファイルが80 Mbのデータ転送になります。

NSDataと同じファイルを取得して、要求本体を正しく設定すると、正常に動作します。

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

は、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]; 

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

答えて

1

私はこの問題を抱えていましたが、私のために修正したのは、ストリームを保持してから非同期HTTPトランザクションの終了時にストリームを解放することでした。これは必要なはずですが、問題の周りに私を持っているように見えません。

+1

本当にあなたのために働いたのですか?私も同じ問題に直面しています。 – Selvin

+0

あなたはこれをどのように説明するためのコードを投稿できますか? – d2burke

1

この回避策は、私の作品:その様子から

[request setTimeoutInterval:240]; 
2

、あなたがヘッダー内の「コンテンツ長」@に設定していないようです。

私はそれを行う方法は、次のようにされています

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

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

関連する問題