4

我有一個HTTP PUT請求和請求主體作爲來自文件流的問題。NSMutableURLRequest和「請求主體流已耗盡」錯誤

無論文件的大小,我得到了錯誤「NSURLErrorDomain -1021請求體流枯竭」

我知道我可以通過實現方法來覆蓋這個問題:

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

但這種方法不好,因爲它會再次上傳整個文件,而40 MB的文件竟然是80 Mb的數據傳輸。

如果我採取與NSData相同的文件,並設置請求正文工作正常。

我試着發送請求異步並同時在兩個同步結果。

這裏是我的代碼,從蘋果的簡單,類似例子:

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 2012-01-20 10:21:36

1

此解決方案對我的作品:

[request setTimeoutInterval:240]; 
2

從外觀上來看,似乎你不設置@在頭「的Content-Length」。

我這樣做,是這樣的方式:

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

無論哪種方式,我是做批量上傳,偶爾有身體流枯竭的錯誤。從我所知道的問題來看,問題是我的設備上只有很少的可用空間,臨時文件會在某些上傳完成之前自動刪除(當收到我測試的錯誤以檢查文件是否仍然存在時,以及它不是)。