使用setHTTPBodyStream而不是使用NSMutableURLRequest的setHTTPBody时遇到问题。
我正在研究通过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的东西?
感谢您的帮助。
的问候。 塞巴斯蒂安。
答案 0 :(得分:1)
尝试设置HTTP方法(如果您还没有)。我通过添加:
来修复“kCFErrorDomainCFNetwork错误303”错误[request setHTTPMethod:@"POST"];
答案 1 :(得分:1)
当您使用setHTTPBody
时,它会自动设置请求的Content-length
标头,但是当您使用setHTTPBodyStream
时,它不会,而是设置Transfer-encoding
chunked
。当无法预先确定流的长度时,使用chunked
传输编码。 (见Chunked transfer encoding。)
将NSURLConnection
与setHTTPBodyStream
结合使用时,您可以手动设置Content-length
,这会阻止Transfer-encoding
chunked
(假设您知道长度)提前):
NSString *contentLength = [NSString stringWithFormat:@"%d", [mydata length]];
[request setValue:contentLength forHTTPHeaderField:@"Content-length"];
使用NSURLSession
时,尝试将Content-length
与分块请求一起手动设置可能无法阻止它成为chunked
请求。