使用NSMutableURLRequest通过http post发送文件时发生网络错误
问题描述:
我使用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。
答
尝试设置HTTP方法(如果您还没有)。我能够加入到修复“kCFErrorDomainCFNetwork错误303”错误:
[request setHTTPMethod:@"POST"];
答
当您使用setHTTPBody
,它会自动将请求的Content-length
头,但是当你使用setHTTPBodyStream
,它没有,而是设置为chunked
的。当不能预先确定流的长度时,使用传输编码chunked
。 (参见Chunked transfer encoding)
当结合使用NSURLConnection
与setHTTPBodyStream
,可以手动设置Content-length
,它会防止chunked
的(假设你事先知道的长度):
NSString *contentLength = [NSString stringWithFormat:@"%d", [mydata length]];
[request setValue:contentLength forHTTPHeaderField:@"Content-length"];
当使用NSURLSession
尝试手动将Content-length
与分块请求一起设置可能不会阻止它成为chunked
请求。