【问题标题】:Network error when sending a file through http post with NSMutableURLRequest使用 NSMutableURLRequest 通过 http post 发送文件时出现网络错误
【发布时间】:2011-11-16 17:31:29
【问题描述】:

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

感谢您的帮助。

问候。 塞巴斯蒂安。

【问题讨论】:

    标签: iphone ios networking post nsmutableurlrequest


    【解决方案1】:

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

    [request setHTTPMethod:@"POST"];
    

    【讨论】:

      【解决方案2】:

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

      NSURLConnectionsetHTTPBodyStream结合使用时,可以手动设置Content-length,这样会阻止chunkedTransfer-encoding(假设你事先知道长度):

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-26
        • 1970-01-01
        • 2010-11-11
        • 2019-09-03
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多