2011-11-16 90 views
1

我使用setHTTPBodyStream代替setHTTPBody與NSMutableURLRequest發生了問題。使用NSMutableURLRequest通過http post發送文件時發生網絡錯誤

我正在處理通過http post發送大文件到服務器的代碼。用下面的部分代碼,一切完美的作品:

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的用法?

感謝您的幫助。

問候。 Sébastien。

回答

1

嘗試設置HTTP方法(如果您還沒有)。我能夠加入到修復「kCFErrorDomainCFNetwork錯誤303」錯誤:

[request setHTTPMethod:@"POST"]; 
1

當您使用setHTTPBody,它會自動將請求的Content-length頭,但是當你使用setHTTPBodyStream,它沒有,而是設置爲chunked的。當不能預先確定流的長度時,使用傳輸編碼chunked。 (參見Chunked transfer encoding

當結合使用NSURLConnectionsetHTTPBodyStream,可以手動設置Content-length,它會防止chunked的(假設你事先知道的長度):

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

當使用NSURLSession嘗試手動將Content-length與分塊請求一起設置可能不會阻止它成爲chunked請求。