1

我在使用 setHTTPBodyStream 而不是 setHTTPBody 和 NSMutableURLRequest 时遇到问题。

我正在研究通过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 使用的东西吗?

谢谢你的帮助。

问候。塞巴斯蒂安。

4

2 回答 2

1

尝试设置 HTTP 方法(如果您还没有)。我能够通过添加以下内容来修复“kCFErrorDomainCFNetwork 错误 303”错误:

[request setHTTPMethod:@"POST"];
于 2012-04-10T11:38:12.060 回答
1

当你使用setHTTPBody时,它会自动设置Content-length请求的头部,但是当你使用时,它不会,setHTTPBodyStream而是设置Transfer-encoding. chunkedchunked无法预先确定流的长度时,使用传输编码。(请参阅分块传输编码。)

NSURLConnection与 结合使用时,setHTTPBodyStream可以手动设置Content-length,它会阻止Transfer-encodingof chunked(假设你事先知道长度):

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

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

于 2014-01-09T18:45:46.007 回答