我正在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];
有谁知道如何做到这一点?
由于
答案 0 :(得分:1)
我建议查看回复statusCode
并确保其为200
。
您说您的服务器报告了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,而不是图像。
我NSLog
data
(或在此块中设置断点并在调试器中发出po data
命令)并查看它的外观,并消除这里含糊不清。如果它在20
和7f
(加上偶尔的0a
甚至可能是0d
)之间主要是十六进制值,则表明响应是一个字符串,然后您可以将其记录为字符串。
也许您可以使用data
十六进制转储的前几行更新您的问题,我们可以帮助您诊断正在发生的事情(因为您经常可以查看前几个字节并确认它是否为文本,一个gzip,或一个图像)。
或者,既然您已经确认它是字符串响应(看起来可能是HTML),您应该将其转换为NSString
并记录它,然后您将看到正在发生的事情。< / p>
顺便提一下,当您修复请求问题时,由于您在完成块中进行了UI更新,请使用[NSOperationQueue mainQueue]
作为完成块,或者确保将UI更新重新发送回来到主队列(正如我在下面的例子中所做的那样)。
因此:
[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];
}];
}
}
// ...
}];