在ios中下载gzip图像

时间:2013-10-31 19:14:25

标签: ios gzip nsdata

我正在iOS中以下列格式下载图像:

    "Content-Encoding" = gzip;
    "Content-Type" = "text/html";
    Date = "Thu, 31 Oct 2013 19:08:58 GMT";
    Expires = "Thu, 01 Jan 1970 00:00:00 GMT";
    "Set-Cookie" = "JSESSIONID=1mrh644zbpgutn1xk116n825u;Path=/";
    "Transfer-Encoding" = Identity;

我正在尝试使用这个:https://github.com/st3fan/cocoa-utils/blob/master/src/NSDataGZipAdditions.m来进行解密...但它似乎没有用。

这是我目前的非工作代码:

NSString *authHeader = [NSString stringWithFormat:@"OAuth %@", credentials.accessToken];
    NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:myURL];
    [request addValue:authHeader forHTTPHeaderField:@"Authorization"];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue new] completionHandler:^(NSURLResponse *response, NSData *data, NSError *err) {
        NSLog(@"Response: %@", response);
        if (err) {
            NSLog(@"Error: %@", err);
        }
        //here create file from _data_

        NSData *mydata = [NSData dataWithCompressedData:data];
        self.propImg1.image = [UIImage imageWithData:mydata];
        [self.propImg1 setNeedsLayout];

有谁知道如何做到这一点?

由于

1 个答案:

答案 0 :(得分:1)

  1. 我建议查看回复statusCode并确保其为200

  2. 您说您的服务器报告了Content-Encoding

    "Content-Encoding" = gzip;
    

    这并不意味着您的NSData是gzip数据。我相信一些Web服务器可以透明地gzip他们的响应,iOS透明地为您解压缩。对于大多数Web服务器请求,您通常不必使用gzip库进行解压缩。

    您可以通过Content-Type表明回复不是图片来证明:

    "Content-Type" = "text/html";
    

    不可否认,我们应该从Content-Type中得出太多结论(因为有些自定义Web服务对于设置这一点很草率),但是与你的断言不一致,结果NSData是gzip数据。

    您在下方添加了评论,向我们展示了NSData,实际上是一个字符串脚本。看起来它可能是HTML,而不是图像。

  3. NSLog data(或在此块中设置断点并在调试器中发出po data命令)并查看它的外观,并消除这里含糊不清。如果它在207f(加上偶尔的0a甚至可能是0d)之间主要是十六进制值,则表明响应是一个字符串,然后您可以将其记录为字符串。

    也许您可以使用data十六进制转储的前几行更新您的问题,我们可以帮助您诊断正在发生的事情(因为您经常可以查看前几个字节并确认它是否为文本,一个gzip,或一个图像)。

    或者,既然您已经确认它是字符串响应(看起来可能是HTML),您应该将其转换为NSString并记录它,然后您将看到正在发生的事情。< / p>

  4. 顺便提一下,当您修复请求问题时,由于您在完成块中进行了UI更新,请使用[NSOperationQueue mainQueue]作为完成块,或者确保将UI更新重新发送回来到主队列(正如我在下面的例子中所做的那样)。

  5. 因此:

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue new] completionHandler:^(NSURLResponse *response, NSData *data, NSError *err) {
        NSLog(@"Response: %@", response);
        if (err) {
            NSLog(@"Error: %@", err);
        }
    
        NSInteger statusCode = -1;
        if ([response isKindOfClass:[NSHTTPURLResponse class]])
        {
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
            statusCode = httpResponse.statusCode;
        }
    
        NSLog(@"statusCode = %d", statusCode); // this should be 200
        NSLog(@"data = %@", data);             // if really text, you'll largely see values b/w 20 and 7f and the occasional 0a
    
        // if it does look like largely 20-7f and a few 0a values, then try displaying it as a string:
        //
        // NSLog(@"data string = %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    
        //here create file from _data_
    
        NSData *mydata = [NSData dataWithCompressedData:data];
        if (mydata) {
            UIImage *image = [UIImage imageWithData:mydata];
            if (image) {
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    self.propImg1.image = image;
                    [self.propImg1 setNeedsLayout];
                }];
            }
        }
    
        // ...
    }];