无法使用某些 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 可能是有意义的。