我们有一个iOS应用,可使用多篇文章将图片上传到服务器。使用wifi时一切正常,但是在3G上获取大图像时,我们会遇到网络错误。
在客户端(iPhone)上:
我有一个
Domain = NSURLErrorDomain代码= -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];
最佳答案
弄清错误的含义,以及错误的根源:
当使用HTTPBodyStream和显式设置的Content-Length标头设置请求,并且输入流提供的字节数不及Content-Length标头中指定的字节数时,就会出现此错误。也就是说,在可以从流中读取规定的字节数之前,底层连接从输入流中获得了EOF。
因此,原因可能是错误地计算了多部分主体内容的长度。这很有可能,因为计算多部分的长度很容易出错。
如果您获得了重定向响应并且输入流已经打开并且可能已经读取了一些数据,也会发生该错误。重定向响应要求输入流将是“倒带的”,以便在接收到正确的响应时可以从头开始读取它。这不是自动发生的,必须在委托中显式实现。 (看看AFNetworking在重定向的情况下是否以某种方式“回退”输入流-这就是是否实现了connection:needNewBodyStream:
)。
我怀疑,在运行循环上存在一些微妙的死锁时,也可能会发生错误,这会阻止连接读取流或从源中读取流。
也可能发生此错误是另一个错误的副作用-并且该错误掩盖了原始错误。
也可能是这样,NSInputStream的内部子类(用于完成AFNetworking中的多部分表单请求)存在错误。恕我直言,实现有点可疑,在其他地方肯定存在有关流的潜在错误。
关于ios - 3G网络上的Mulipartpost NSURLConnection问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16983985/