1

我们有一个 iOS 应用程序,它使用多部分帖子将图像上传到服务器。使用 wifi 时一切正常,但在 3G 上拍摄大图像时,我们遇到了网络错误。

在客户端(iPhone)上:

我有一个

Domain=NSURLErrorDomain Code=-1021 “请求体流耗尽”</p>

基于这篇文章,我尝试使用该方法使用 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];
4

2 回答 2

2

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

当请求已设置 HTTPBodyStream 和 Content-Length 标头明确设置,并且输入流未提供与 Content-Length 标头中指定的一样多的字节时,您会收到此错误。也就是说,在可以从流中读取指定数量的字节之前,底层连接从输入流中获得了 EOF。

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

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

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

也可能发生,这个错误是另一个错误的副作用——并且这个错误掩盖了原来的错误。

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

于 2013-06-07T18:34:47.000 回答
0

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

于 2013-06-07T13:56:57.707 回答