Загрузка изображения 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 ответ
Я бы предложил проверить ответ
statusCode
и убедитесь, что это200
,Вы говорите, что ваш сервер сообщил о
Content-Encoding
из"Content-Encoding" = gzip;
это не значит, что ваш
NSData
это данные gzip. Я считаю, что некоторые веб-серверы могут прозрачно распаковать свои ответы, а iOS прозрачно распакует это для вас. Как правило, вам не нужно использовать библиотеку gzip для распаковки большинства запросов веб-сервера.Об этом свидетельствуют ваши
Content-Type
предположил бы, что ответ не был изображением:"Content-Type" = "text/html";
Следует признать, что нам следует сделать слишком много выводов из
Content-Type
(потому что некоторые пользовательские веб-сервисы неряшливы в настройке этого), но это не согласуется с вашим утверждением о том, чтоNSData
это данные gzip.Вы добавили комментарий ниже, показывая нам
NSData
и это, по сути, строковый скрипт. Похоже, что это, вероятно, HTML, а не изображение.Я бы
NSLog
data
(или установите точку останова внутри этого блока и выполните командуpo data
команда в отладчике) и посмотреть, как это выглядит, и устранить здесь двусмысленность. Если это в основном шестнадцатеричные значения между20
а также7f
(плюс случайный0a
и, возможно, даже0d
), это говорит о том, что ответом является строка, которую вы затем можете записать в виде строки.Возможно, вы можете обновить свой вопрос с первых нескольких строк
data
шестнадцатеричный дамп, и мы можем помочь вам диагностировать происходящее (так как вы часто можете посмотреть первые несколько байтов и подтвердить, является ли это текстом, gzip или изображением).Или, теперь, когда вы подтвердили, что это строковый ответ (похоже, это может быть HTML), вы должны преобразовать его в
NSString
и войдите, и вы увидите, что происходит.Кстати, когда вы исправляете проблему с запросом, так как вы выполняете обновление пользовательского интерфейса в своем блоке завершения, либо используйте
[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];
}];
}
}
// ...
}];