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

使用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

当结合使用NSURLConnectionsetHTTPBodyStream,可以手动设置Content-length,它会防止chunked的(假设你事先知道的长度):

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

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