无法使用某些 link 使用 NSURLSession 下载图像
Can't download image with NSURLSession with some link
我无法下载这张图片:
http://img2.imgtn.bdimg.com/it/u=3742910000,2737153630&fm=15&gp=0.jpg
我用的是NSURLSession downloadTask,但是无效,Chrome safari可以获取。
我的代码:
task = [_session downloadTaskWithURL:attachmentURL
completionHandler: ^(NSURL *temporaryFileLocation, NSURLResponse *response, NSError *error) {
if (error != nil) {
NSLog(@"error:%@", error.localizedDescription);
} else {
NSString *filePath = [self saveFrom:...];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", filePath);
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSLog(@"data length: %lu", data.length);
// data length is error! smaller than should be
});
}
}];
[task resume];
所有客户端传输的信息都比 'get me this resource' 多。它们还传输数据,例如正在使用的用户代理(即客户端是什么)。在 nsurlsession 的情况下,它将用户代理设置为看起来不像网络浏览器的东西,并且在这种情况下服务器很可能会回复 403 错误(尝试在 URL 你会得到一个 403 错误。
正常下载:
$ curl "http://img2.imgtn.bdimg.com/it/u=3742910000,2737153630&fm=15&gp=0.jpg" -o img.jpg
$ file img.jpg
img.jpg: XML 1.0 document text, ASCII text
当我将用户代理字符串更改为类似于 firefox 时:
$ curl -A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0' "http://img2.imgtn.bdimg.com/it/u=3742910000,2737153630&fm=15&gp=0.jpg" -o img.jpg
$ file img.jpg
img.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, baseline, precision 8, 500x333, frames 3
因此我们需要为您的 nsurlsession 执行相同或类似的操作。由于我们有 _session
变量,我们可以做类似的事情(这只是示例代码 - 请自己制作):
NSMutableDictionary *md = [_session.configuration.httpAdditionalHeaders mutableCopy];
if (md == nil) {
md = [[NSMutableDictionary alloc] init];
}
md[@"User-Agent"] = @"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0";
_session.configuration.HTTPAdditionalHeaders = md;
尽管如此,如果您已经使用一些 NSURlSessionConfiguration
创建了 session,那么在其中添加 headers 可能是有意义的。
我无法下载这张图片: http://img2.imgtn.bdimg.com/it/u=3742910000,2737153630&fm=15&gp=0.jpg 我用的是NSURLSession downloadTask,但是无效,Chrome safari可以获取。 我的代码:
task = [_session downloadTaskWithURL:attachmentURL
completionHandler: ^(NSURL *temporaryFileLocation, NSURLResponse *response, NSError *error) {
if (error != nil) {
NSLog(@"error:%@", error.localizedDescription);
} else {
NSString *filePath = [self saveFrom:...];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", filePath);
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSLog(@"data length: %lu", data.length);
// data length is error! smaller than should be
});
}
}];
[task resume];
所有客户端传输的信息都比 'get me this resource' 多。它们还传输数据,例如正在使用的用户代理(即客户端是什么)。在 nsurlsession 的情况下,它将用户代理设置为看起来不像网络浏览器的东西,并且在这种情况下服务器很可能会回复 403 错误(尝试在 URL 你会得到一个 403 错误。
正常下载:
$ curl "http://img2.imgtn.bdimg.com/it/u=3742910000,2737153630&fm=15&gp=0.jpg" -o img.jpg
$ file img.jpg
img.jpg: XML 1.0 document text, ASCII text
当我将用户代理字符串更改为类似于 firefox 时:
$ curl -A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0' "http://img2.imgtn.bdimg.com/it/u=3742910000,2737153630&fm=15&gp=0.jpg" -o img.jpg
$ file img.jpg
img.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, baseline, precision 8, 500x333, frames 3
因此我们需要为您的 nsurlsession 执行相同或类似的操作。由于我们有 _session
变量,我们可以做类似的事情(这只是示例代码 - 请自己制作):
NSMutableDictionary *md = [_session.configuration.httpAdditionalHeaders mutableCopy];
if (md == nil) {
md = [[NSMutableDictionary alloc] init];
}
md[@"User-Agent"] = @"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0";
_session.configuration.HTTPAdditionalHeaders = md;
尽管如此,如果您已经使用一些 NSURlSessionConfiguration
创建了 session,那么在其中添加 headers 可能是有意义的。