【问题标题】:Where to find the file downloaded with a URL?在哪里可以找到使用 URL 下载的文件?
【发布时间】:2021-09-09 19:13:01
【问题描述】:

当我使用 URL 下载文件时:

guard let url = url else { return }
let task = URLSession.shared.dataTask(with: url) { data, response, error in
    guard let data = data, error == nil else {
        return
    }
    if let doc = PDFDocument(data: data) {
        DispatchQueue.main.async {
            self.document = doc
        }
    }
}
task.resume()

文件是保存在目录中还是必须保存?如果是前者,文件保存在哪里?我尝试使用文件名查找文件,但找不到:

guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
let fileName = url.lastPathComponent
let localURL = documentsDirectory.appendingPathComponent(fileName)

【问题讨论】:

  • 这是什么?让 localURL = filesDirectory.appendingPathComponent(fileName)
  • @ElTomato 对不起,我应该更清楚。我有一个url,用于通过 HTTP 下载文件。我尝试使用let localURL = documentsDirectory.appendingPathComponent(fileName) 的文件名重建localURL,认为这是自动保存文件的位置。所以我的问题是,即使在我使用try data.write(to: localURL) 下载文件后,我是否必须自己保存文件?
  • 不,我认为它没有被保存,它正在创建 PDF 文档的内存表示。是的,您需要自己保存
  • 您的意图是将其保存在本地,您应该使用downloadTask 而不是dataTask。请注意,它将保存一个临时文件whatever.tmp。您仍然有责任提供filename.ext 和最终位置(目录)以使用 FileManager moveItem 方法将文件移动到。

标签: ios swift nsfilemanager


【解决方案1】:

您没有下载文件。您正在将内容从 URL 下载到 Data 对象中,然后将该数据转换为 PDFDocument,这是 PDF 文档的内存表示。

如果要将文件保存到磁盘,则需要将文件保存到磁盘。您当前的代码没有这样做。

PDFDocument 类包括方法write(to:),它将您的 PDF 文档保存到磁盘。您必须构建一个描述磁盘上文件路径的 URL,然后使用 write(to:) 保存到该 URL。

【讨论】:

    【解决方案2】:

    URLSession docs 提到了这一点:

    数据任务使用 NSData 对象发送和接收数据。数据任务用于向服务器发送简短的、通常是交互式的请求。

    下载任务以文件的形式检索数据,并支持在应用未运行时进行后台下载和上传。

    由于您使用的是URLSession.shared.dataTask(with:),它为您提供了数据的内存表示。如果您希望将其保存到文件中,您不妨使用downloadTask,然后在下载完成后将文件移动到相应的目录。

    【讨论】:

      猜你喜欢
      • 2020-12-16
      • 2015-01-21
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多