我们有一个iOS应用程序,可以使用多部分帖子将图像上传到服务器。使用wifi时一切正常,但对于大型图像,我们遇到了网络错误。
在客户端(iPhone)上:
我有一个
Domain = NSURLErrorDomain Code = -1021“请求正文流耗尽”
基于this post我尝试将AFNetwork库与该方法一起使用,但仍然得到了相同的结果。
在服务器上:
我已经设置了一个代理来查看请求,我正在
“插座断管”
通常在传输740Kb之后
那么,我做错了什么?就像我在wifi上所说的一切都很好,在3G上用小图像也很好。
AFNetwork版本代码(对于大图像,在600 - 800 kb后停止传输):
AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:self.baseURL];
request = [client multipartFormRequestWithMethod:@"POST"
path:nil
parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
{
for (NSString* partType in self.parts) {
if ([partType isEqualToString:@"jsonpart"]) {
[formData appendPartWithFormData:[self.parts objectForKey:partType] name:@"@json"];
}
else{ //is an image for sure
[formData appendPartWithFileData:[self.parts objectForKey:partType]
name:partType
fileName:[NSString stringWithFormat:@"%@-%d.jpg", partType, [partType hash]]
mimeType:@"image/jpeg"];
}
}
[formData throttleBandwidthWithPacketSize:kAFUploadStream3GSuggestedPacketSize delay:kAFUploadStream3GSuggestedDelay];
}];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[client enqueueHTTPRequestOperation:operation];
答案 0 :(得分:2)
澄清错误的含义,以及错误的来源:
如果使用HTTPBodyStream和Content-Length标头显式设置了请求,并且输入流不提供Content-Length标头中指定的字节数,则会出现此错误。也就是说,在从流中读取所述字节数之前,底层连接从输入流中获得了EOF。
因此,原因可能是多部分主体内容的计算长度不正确。这很有可能,因为计算多部分的长度非常容易出错。
如果您有重定向响应并且输入流已经打开并且可能已读取某些数据,则也会发生错误。重定向响应要求输入流将“倒带”,以便在收到正确的响应时从头开始读取。这不会自动发生,必须在委托中明确实现。 (看看AFNetworking是否在重定向的情况下以某种方式“回滚”输入流 - 即connection:needNewBodyStream:
是否已实现)。
可能,我怀疑,当运行循环上存在一些微妙的死锁时,也可能发生错误,这会阻止连接读取流 - 或者要从其源读取流。
也可能发生此错误是另一个错误的副作用 - 并且此错误会掩盖原始错误。
也可能是这样的情况,用于在AFNetworking中完成多部分表单请求的NSInputStream的内部子类有一个错误。恕我直言,实施有点可疑,其他地方肯定存在关于流的潜在错误。
答案 1 :(得分:0)
好的,花了很多时间在这上面我终于明白了。与代码无关,由于某种原因公司防火墙在这里发挥作用。关闭防火墙一切正常。奇怪,但这解决了它,并且不在iOS或代码范围内。