使用 NSURLSessionDownloadTask 从重定向 URL 下载 pdf 文件

Posted

技术标签:

【中文标题】使用 NSURLSessionDownloadTask 从重定向 URL 下载 pdf 文件【英文标题】:Downloading a pdf file using NSURLSessionDownloadTask from redirect URL 【发布时间】:2014-11-17 13:36:01 【问题描述】:

我正在制作一个用户登录网站并下载一些 pdf 文件的应用程序。

我能够使用 URLSession 成功登录网站。

现在我的问题在于文件的下载。

该网站使用带有以下“http://www.someurl.com/getfile.asp?FILE=12345”的网址 这显然是对嵌入在获取 url 中的实际 pdf 文件的重定向,

尝试将 NSURLSessionDownloadTask 与 url 一起使用,但无法下载 pdf 文件。

对如何从响应中获取实际 URL 并下载文件有任何帮助吗?

我在这里尝试过:注意我更改了网址只是为了提问

//1 create NSURL to the login page
NSURL *tempURL = [NSURL URLWithString:@"http://www.someurl.com/login.asp"];
// 2 create Mutable request with header and username and password
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:tempURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:1.0];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
//this is hard coded based on your suggested values, obviously you'd probably need to make this more dynamic based on your application's specific data to send
NSString *postString = @"userid=abcdef&passwd=123456789&submit=Login";

NSData *data = [postString dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[data length]] forHTTPHeaderField:@"Content-Length"];
//3 Create NSURLSession to login
NSURLSession *session = [NSURLSession sharedSession];
//4 Create Session Data task to download the html page required
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
                                      

                                          NSURL *fileURL = [NSURL URLWithString:@"http://www.someurl.com/file.asp?File=20904"];

                                          NSURLSessionDownloadTask *pdfDownload = [[NSURLSession sharedSession] downloadTaskWithURL:fileURL completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) 

                                              NSLog(@"%@", location.description);

                                              NSFileManager *fileManager = [NSFileManager defaultManager];
                                              NSError *error1;

                                              //getting application's document directory path
                                              NSArray * tempArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
                                              NSString *docsDir = [tempArray objectAtIndex:0];

                                              //adding a new folder to the documents directory path
                                              NSString *appDir = [docsDir stringByAppendingPathComponent:@"/PDFs/"];

                                              //Checking for directory existence and creating if not already exists
                                              if(![fileManager fileExistsAtPath:appDir])
                                              
                                                  [fileManager createDirectoryAtPath:appDir withIntermediateDirectories:NO attributes:nil error:&error1];
                                              

                                              //retrieving the filename from the response and appending it again to the path
                                              //this path "appDir" will be used as the target path 
                                              appDir =  [appDir stringByAppendingFormat:@"/%@",[[pdfDownload response] suggestedFilename]];

                                              //checking for file existence and deleting if already present.
                                              if([fileManager fileExistsAtPath:appDir])
                                              
                                                  NSLog([fileManager removeItemAtPath:appDir error:&error1]?@"deleted":@"not deleted");
                                              

                                              //moving the file from temp location to app's own directory
                                              BOOL fileCopied = [fileManager moveItemAtPath:[location path] toPath:appDir error:&error1];
                                              NSLog(fileCopied ? @"Yes" : @"No");
                                              NSLog(@"%@",appDir);
                                          ];

                                          [pdfDownload resume];

                                      ];
[postDataTask resume];


当我记录这个时,我得到 null NSLog(@"%@",appDir);

【问题讨论】:

您必须将路径组件附加到目录,而不是格式。 appDir = [appDir stringByAppendingPathComponent:@"myFile.pdf"]; P.S.使用stringByAppendingPathComponent时不需要使用'/' 你应该像块的参数一样简单地使用response而不访问pdfDownload @FrancescoFrascà 非常感谢,现在appDir是:appDir = [appDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",[responseSuggestedFilename]]]; 不客气!我为其他用户添加了格式更好的答案 【参考方案1】:

您必须将路径组件附加到目录,而不是格式。试试这个

appDir = [appDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",[response suggestedFilename]]];

请记住,使用stringByAppendingPathComponent:时不需要使用'/'

【讨论】:

以上是关于使用 NSURLSessionDownloadTask 从重定向 URL 下载 pdf 文件的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)