Swift中通过URL下载的文件存储位置及自动保存问题咨询
问题解答
你当前使用的URLSession.shared.dataTask不会自动将下载的文件持久化存储到本地磁盘,下载得到的文件内容仅临时存储在内存的data变量中,你需要手动执行写入操作才能将文件保存到沙盒指定目录。
只有使用downloadTask类型的请求时,系统才会自动生成临时存储文件,路径位于App沙盒的tmp/目录下,该目录下的文件不属于持久化存储,系统会在App退出、磁盘空间不足时自动清理,无法长期留存。
正是因为你当前的实现没有持久化写入逻辑,所以你在Documents目录下查找对应文件自然无法找到。
如果需要将下载的PDF持久化存储到本地,可参考以下两种实现方案:
方案1:基于现有dataTask逻辑手动写入
拿到下载完成的data后,直接写入你拼接的本地路径即可:
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 } // 拼接本地存储路径 guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let fileName = url.lastPathComponent let localURL = documentsDirectory.appendingPathComponent(fileName) do { // 手动写入本地磁盘 try data.write(to: localURL) print("文件保存成功,路径:\(localURL.path)") // 原有PDF加载逻辑保持不变 if let doc = PDFDocument(data: data) { DispatchQueue.main.async { self.document = doc } } } catch { print("文件写入失败:\(error.localizedDescription)") } } task.resume()
方案2:改用downloadTask优化大文件下载
如果下载的PDF文件较大,推荐使用downloadTask避免内存占用过高,该方法会自动将下载内容写入临时目录,你只需要在下载完成后将临时文件移动到目标持久化路径即可:
guard let url = url else { return } let task = URLSession.shared.downloadTask(with: url) { tempLocalUrl, response, error in guard let tempLocalUrl = tempLocalUrl, error == nil else { return } guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let fileName = url.lastPathComponent let localURL = documentsDirectory.appendingPathComponent(fileName) do { // 把临时文件移动到持久化目录,系统会自动清理原临时文件 try FileManager.default.moveItem(at: tempLocalUrl, to: localURL) print("文件保存成功,路径:\(localURL.path)") // 直接从本地路径加载PDF if let doc = PDFDocument(url: localURL) { DispatchQueue.main.async { self.document = doc } } } catch { print("文件移动失败:\(error.localizedDescription)") } } task.resume()
内容的提问来源于stack exchange,提问作者Kevvv
相关产品推荐
相关产品推荐

