Mulipartpost NSURLConnection超过3G网络问题

时间:2013-06-07 12:19:33

标签: ios objective-c nsurlconnection afnetworking 3g-network

我们有一个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];

2 个答案:

答案 0 :(得分:2)

澄清错误的含义,以及错误的来源:

如果使用HTTPBodyStream和Content-Length标头显式设置了请求,并且输入流不提供Content-Length标头中指定的字节数,则会出现此错误。也就是说,在从流中读取所述字节数之前,底层连接从输入流中获得了EOF。

因此,原因可能是多部分主体内容的计算长度不正确。这很有可能,因为计算多部分的长度非常容易出错。

如果您有重定向响应并且输入流已经打开并且可能已读取某些数据,则也会发生错误。重定向响应要求输入流将“倒带”,以便在收到正确的响应时从头开始读取。这不会自动发生,必须在委托中明确实现。 (看看AFNetworking是否在重定向的情况下以某种方式“回滚”输入流 - 即connection:needNewBodyStream:是否已实现)。

可能,我怀疑,当运行循环上存在一些微妙的死锁时,也可能发生错误,这会阻止连接读取流 - 或者要从其源读取流。

也可能发生此错误是另一个错误的副作用 - 并且此错误会掩盖原始错误。

也可能是这样的情况,用于在AFNetworking中完成多部分表单请求的NSInputStream的内部子类有一个错误。恕我直言,实施有点可疑,其他地方肯定存在关于流的潜在错误。

答案 1 :(得分:0)

好的,花了很多时间在这上面我终于明白了。与代码无关,由于某种原因公司防火墙在这里发挥作用。关闭防火墙一切正常。奇怪,但这解决了它,并且不在iOS或代码范围内。