【问题标题】:Downloading a PDF file and saving it to temporary directory iOS下载 PDF 文件并将其保存到临时目录 iOS
【发布时间】:2015-08-28 05:52:14
【问题描述】:

我的应用程序显示列表中的 PDF 文件。我正在努力理解 iOS 中的文件管理。我在这里阅读了指南,但没有帮助:https://developer.apple.com/library/mac//documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40010672

我不知道如何访问 /tmp 文件夹来写入它。我想我需要使用NSURLConnectionURLsForDirectory:inDomains: 方法。但是我不知道URLsForDirectory:inDomains:方法需要什么参数来返回临时目录以及如何将NSData*NSURLConnection转换为PDF文件。

【问题讨论】:

  • 您提供的链接与我的内容相同。

标签: ios objective-c pdf nsurlconnection nsfilemanager


【解决方案1】:

您使用以下代码获取存储在/tmp 中的文件的文件路径:

NSURL *tmpDirURL = [NSURL fileURLWithPath:NSTemporaryDirectory() isDirectory:YES];        // get /tmp folder path

NSURL *fileURL = [[tmpDirURL URLByAppendingPathComponent:@"filename"] URLByAppendingPathExtension:@"jpg"];

NSLog(@"fileURL: %@", [fileURL path]);

【讨论】:

    【解决方案2】:

    您可以将文件保存到/Documents 文件夹,稍后在不需要时将其删除。

    看看:

    +(NSString *)writeDataToDocuments:(NSData *)data withFilename:(NSString *)filename{
        NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
        NSString *filePath = [[NSString alloc] initWithString: [docsPath stringByAppendingPathComponent:filename]];
        [data writeToFile:filePath atomically:YES];
        return filePath;
    }
    

    【讨论】:

    • 这不是正确的答案。在任何情况下,临时数据都应保存在文档目录中。
    • 是违法还是什么?恕我直言,这取决于临时数据的性质。由于在 /tmp 文件夹中您无法控制数据的生命周期,因此最好使用 docs 文件夹并自己管理临时持久性。
    • “在任何情况下”可能有点苛刻。 :) 将临时数据直接存储在文档中的问题是 i 可能会被 iCloud 备份(除非另有说明)。此外,在某种程度上,文档目录应该由用户单独处理,而不是被程序员“滥用”。当用户决定下载 PDF 并查看它,然后(稍后的应用程序会话)决定删除它时,该 PDF 应该放在 Documents 目录中。但它不再是一个“临时”文件。
    • 当然。这取决于您对“临时”的个人定义。
    【解决方案3】:

    1) 使用 NSURLConnection

    NSURL *fileURL = [NSURL URLWithString:@"your url here"];
    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithURL:fileURL completionHandler:^(NSData *data,
                                                          NSURLResponse *response,
                                                          NSError *error)
    {
        if(!error)
        {
            NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[response suggestedFilename]];
            [data writeToFile:filePath atomically:YES];
        }
    
    }] resume];
    

    2) 使用 NSURLSession

    NSURL *fileURL = [NSURL URLWithString:@"url here"];
    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithURL:fileURL completionHandler:^(NSData *data,
                                                          NSURLResponse *response,
                                                          NSError *error)
    {
        if(!error)
        {
            NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[response suggestedFilename]];
            [data writeToFile:filePath atomically:YES];
        }
    
    }] resume];
    

    参考nsurlsession-tutorial 链接。

    【讨论】:

    • 这会发出警告:Incompatible pointer to integer conversion passing 'NSString *(void)' to parameter of type 'NSSearchPathDirectory' (aka 'enum NSSearchPathDirectory')
    • @ShantanuPaul:在我替换警告代码时检查编辑的答案
    • 也会引发异常。
    【解决方案4】:
    NSData *dataPdf = [NSData dataWithContentsOfURL:pdfOnline.url];
    
    //Get path directory
    NSArray *paths =
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,                              
    NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    //Create PDF_Documents directory
    documentsDirectory = [documentsDirectory     
    stringByAppendingPathComponent:@"PDF_Documents"];
    [[NSFileManager defaultManager]    
    createDirectoryAtPath:documentsDirectory withIntermediateDirectories:YES attributes:nil error:nil];
    
    NSString *filePath = [NSString stringWithFormat:@"%@/%@",documentsDirectory, @"**PUT FILENAME YOU WANT**"];
    
    [dataPdf writeToFile:filePath atomically:YES];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多