Загрузка изображения gzip в ios

Я загружаю изображение в 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 ответ

Решение
  1. Я бы предложил проверить ответ statusCode и убедитесь, что это 200,

  2. Вы говорите, что ваш сервер сообщил о Content-Encoding из

    "Content-Encoding" = gzip;
    

    это не значит, что ваш NSData это данные gzip. Я считаю, что некоторые веб-серверы могут прозрачно распаковать свои ответы, а iOS прозрачно распакует это для вас. Как правило, вам не нужно использовать библиотеку gzip для распаковки большинства запросов веб-сервера.

    Об этом свидетельствуют ваши Content-Type предположил бы, что ответ не был изображением:

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

    Следует признать, что нам следует сделать слишком много выводов из Content-Type (потому что некоторые пользовательские веб-сервисы неряшливы в настройке этого), но это не согласуется с вашим утверждением о том, что NSData это данные gzip.

    Вы добавили комментарий ниже, показывая нам NSData и это, по сути, строковый скрипт. Похоже, что это, вероятно, HTML, а не изображение.

  3. Я бы NSLog data (или установите точку останова внутри этого блока и выполните команду po data команда в отладчике) и посмотреть, как это выглядит, и устранить здесь двусмысленность. Если это в основном шестнадцатеричные значения между 20 а также 7f (плюс случайный 0a и, возможно, даже 0d), это говорит о том, что ответом является строка, которую вы затем можете записать в виде строки.

    Возможно, вы можете обновить свой вопрос с первых нескольких строк data шестнадцатеричный дамп, и мы можем помочь вам диагностировать происходящее (так как вы часто можете посмотреть первые несколько байтов и подтвердить, является ли это текстом, gzip или изображением).

    Или, теперь, когда вы подтвердили, что это строковый ответ (похоже, это может быть HTML), вы должны преобразовать его в NSString и войдите, и вы увидите, что происходит.

  4. Кстати, когда вы исправляете проблему с запросом, так как вы выполняете обновление пользовательского интерфейса в своем блоке завершения, либо используйте [NSOperationQueue mainQueue] для вашего блока завершения, или убедитесь, что отправили обновление пользовательского интерфейса обратно в основную очередь (как я сделал в моем примере ниже).

Таким образом:

[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];
            }];
        }
    }

    // ...
}];
Другие вопросы по тегам