使用NSMutableURLRequest通过http post发送文件时出现网络错误

时间:2011-11-16 17:31:29

标签: iphone ios networking post nsmutableurlrequest

使用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的东西?

感谢您的帮助。

的问候。 塞巴斯蒂安。

2 个答案:

答案 0 :(得分:1)

尝试设置HTTP方法(如果您还没有)。我通过添加:

来修复“kCFErrorDomainCFNetwork错误303”错误
[request setHTTPMethod:@"POST"];

答案 1 :(得分:1)

当您使用setHTTPBody时,它会自动设置请求的Content-length标头,但是当您使用setHTTPBodyStream时,它不会,而是设置Transfer-encoding chunked。当无法预先确定流的长度时,使用chunked传输编码。 (见Chunked transfer encoding。)

NSURLConnectionsetHTTPBodyStream结合使用时,您可以手动设置Content-length,这会阻止Transfer-encoding chunked(假设您知道长度)提前):

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

使用NSURLSession时,尝试将Content-length与分块请求一起手动设置可能无法阻止它成为chunked请求。