1

我在使用 AFNetworking 从 Rackspace 存储库下载文件时遇到了问题。

基本上有时文件没有完全传输,但 AFNetworking 会触发成功块。收到的 http 响应代码也设置为 200 OK。

这种情况只发生在 3G 连接上。在 WiFi 上,我们正确接收所有文件。

谁能给我们任何可能导致这种行为的提示?

编辑,2012-05-10 我检测到问题可能出在其他地方,我正在做的是检查文件的 CRC 并将其与预期的 CRC 进行比较。但是(仅当连接超过 3G 时才会发生)CRC 校验失败。下面是我用来下载文件然后检查它的 CRC 的一些代码片段:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:urlNS];

AFImageRequestOperation * imageRequestOperation = [AFImageRequestOperation imageRequestOperationWithRequest:request
                                                   imageProcessingBlock:nil
                                                   cacheName: nil
                                                   success: ^(NSURLRequest * request, NSHTTPURLResponse * response, UIImage * image)
                                                   {
                                                       [self.class postProcessDownloadAfNetworking: request andResponse: response resultImage: image error: nil];
                                                   }
                                                   failure: ^(NSURLRequest * request, NSHTTPURLResponse * response, NSError * error)
                                                   {
                                                       [self.class postProcessDownloadAfNetworking: request andResponse: response resultImage: nil error: error];                                                        
                                                   }];

imageRequestOperation.outputStream = [NSOutputStream outputStreamToFileAtPath:obj.destinationFilename append:NO];


[imageRequestOperation start]; 

然后在回调方法中:

if(error == nil)
{
    NSData * data = [NSData dataWithContentsOfFile:imgData.destinationFilename];
    uint32_t fileCrcInt = [data crc32];
    NSString * fileCrcHex  = [NSString stringWithFormat:@"%2X", (int) fileCrcInt] ;
    NSString * fileCrcHex2 = [NSString stringWithFormat:@"000000%@", fileCrcHex] ;
    fileCrcHex2 = [fileCrcHex2 substringFromIndex:[fileCrcHex2 length]-8];

    // Compare CRC
    if( [expectedCRC isEqualToString:fileCrcHex2] )
    {
       (...)

指令 [NSData dataWithContentsOfFile:] 是否有可能在 AFNetworking 的输出流完全写入文件之前读取文件?也许我遇到了某种 iOS 磁盘缓存或类似的东西。

4

2 回答 2

7

在没有其他数据的情况下,我会大胆猜测:

某些文件类型可能会受到 3G 上的透明代理的影响,这可能会改变这些文件。这适用于具有有损压缩的广泛认可的文件类型。基本上,如果您尝试下载 JPEG,代理可能会提供比您预期更小的 JPEG。单元提供者认为它“足够接近”,并且双重压缩的 JPEG 更小(而且丑得多)。自然,重新压缩的图像将具有不同的 CRC。

这也可能适用于其他文件类型。

我已经阅读了有关 T-Mobile 这样做的报道。我认为其他手机提供商也注意到了这一点。

有两个可能的修复:

正如 Tony Million 在下面的评论中所指出的,切换到 HTTPS 将解决此问题,因为代理将不再处于通信中间。

如果您的资源可通过 HTTPS 获得,那么这是一个很棒且简单的解决方法。

如果没有,您可以尝试添加一个 HTTP 标头来解决此问题。我无法验证它是否适合您,因为我的手机提供商不玩这个特定的游戏:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.5

这个想法是为您的请求添加一个无转换缓存控制 HTTP 标头。这应该不允许服务器进行这种更改。

于 2012-05-11T02:15:49.790 回答
1

这似乎是一个机架空间/服务器问题。如果服务器发回 200 响应代码,则表明连接和文件/数据传输成功。

如果没有关于服务器端的更多细节,我们真的帮不了你。

于 2012-05-08T14:23:27.210 回答