在 Swift 中从 URL 下载并保存文件
Download And Save File From URL in Swift
我正在尝试...
从服务器下载文件(MLModel)
将该文件保存到设备
重新启动应用程序
使用文件保存到的 URL(路径)来访问下载的文件。这样我就不必在每次应用程序启动时都重新下载它
let download = URLSession.shared.downloadTask(with: url) { (urlOrNil, response, error) in
if let error = error {
print("❌ There was an error in \(#function) \(error)")
completion(nil)
return
}
// the location the mlModel is saved at
guard let fileURL = urlOrNil else {print("❇️>>>\(#file) \(#line)"); return }
do {
//compiles the model
let compiledUrl = try MLModel.compileModel(at: fileURL)
//turns the model into an MLModel
let model = try MLModel(contentsOf: compiledUrl)
print("newModel Complete ")
// find the app support directory
let fileManager = FileManager.default
// Finds a place to save the MLModel
let appSupportDirectory = try! fileManager.url(for: .applicationSupportDirectory,
in: .userDomainMask, appropriateFor: compiledUrl, create: true)
// create a permanent URL in the app support directory
let permanentUrl = appSupportDirectory.appendingPathComponent(compiledUrl.lastPathComponent)
print("\(permanentUrl)")
// if the file exists, replace it. Otherwise, copy the file to the destination.
if fileManager.fileExists(atPath: permanentUrl.absoluteString) {
_ = try fileManager.replaceItemAt(permanentUrl, withItemAt: compiledUrl)
} else {
try fileManager.copyItem(at: compiledUrl, to: permanentUrl)
}
let newModel = try MLModel(contentsOf: permanentUrl)
print("", newModel)
completion(newModel)
}catch{
print("❌ There was an error in \(#function) \(error) : \(error.localizedDescription)")
}
}.resume()
据我了解,这是将我的 MLModel 保存到 "permanentUrl"。所以我重新启动应用程序,我不再 运行 downloadTask(因为 MLModel 应该被保存?),我尝试使用此代码访问我复制到永久 URL 的 MLModel
let permanentUrl = URL(string:"file:///var/mobile/Containers/Data/Application/659B2FEE-4384-4BBE-97D1-B1575BF1EB3B/Library/Application%20Support/CFNetworkDownload_v3EpLD.mlmodelc")
do {
let model = try MLModel(contentsOf: permanentUrl!)
print(model)
}catch{
print("❌ There was an error in \(#function) \(error) : \(error.localizedDescription)")
}
我收到这个错误
file:///var/mobile/Containers/Data/Application/659B2FEE-4384-4BBE-97D1-B1575BF1EB3B/Library/Application 귑ీƢupport/CFNetworkDownload_v3EpLD.mlmodelc does not exist" UserInfo={NSLocalizedDescription=file:///var/mobile/Containers/Data/Application/659B2FEE-4384-4BBE-97D1-B1575BF1EB3B/Library/Application 귑ీƢupport/CFNetworkDownload_v3EpLD.mlmodelc does not exist} : file:///var/mobile/Containers/Data/Application/659B2FEE-4384-4BBE-97D1-B1575BF1EB3B/Library/Application 귑ీƢupport/CFNetworkDownload_v3EpLD.mlmodelc does not exist
所以我猜 MLModel 没有保存?我在这里错过了什么?我假设我用 downloadTask 保存了 MLModel,但我只是没有以正确的方式检索它。如何访问我保存的文件?
这就是答案。
在 downloadTask 函数中,我打印了 compiledUrl.lastPathComponent 并保存了它。然后,当我重新 运行 应用程序时,我 运行 此代码找到文件的 URL。
// saved compiledUrl.lastPathComponent
let filename = "CFNetworkDownload_B9QvT1.mlmodelc"
let fileManager = FileManager.default
let appSupportDirectory = try! fileManager.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let permanentUrl = appSupportDirectory.appendingPathComponent(filename)
let model = try? MLModel(contentsOf: permanentUrl)
print(model)
我正在尝试...
从服务器下载文件(MLModel)
将该文件保存到设备
重新启动应用程序
使用文件保存到的 URL(路径)来访问下载的文件。这样我就不必在每次应用程序启动时都重新下载它
let download = URLSession.shared.downloadTask(with: url) { (urlOrNil, response, error) in
if let error = error {
print("❌ There was an error in \(#function) \(error)")
completion(nil)
return
}
// the location the mlModel is saved at
guard let fileURL = urlOrNil else {print("❇️>>>\(#file) \(#line)"); return }
do {
//compiles the model
let compiledUrl = try MLModel.compileModel(at: fileURL)
//turns the model into an MLModel
let model = try MLModel(contentsOf: compiledUrl)
print("newModel Complete ")
// find the app support directory
let fileManager = FileManager.default
// Finds a place to save the MLModel
let appSupportDirectory = try! fileManager.url(for: .applicationSupportDirectory,
in: .userDomainMask, appropriateFor: compiledUrl, create: true)
// create a permanent URL in the app support directory
let permanentUrl = appSupportDirectory.appendingPathComponent(compiledUrl.lastPathComponent)
print("\(permanentUrl)")
// if the file exists, replace it. Otherwise, copy the file to the destination.
if fileManager.fileExists(atPath: permanentUrl.absoluteString) {
_ = try fileManager.replaceItemAt(permanentUrl, withItemAt: compiledUrl)
} else {
try fileManager.copyItem(at: compiledUrl, to: permanentUrl)
}
let newModel = try MLModel(contentsOf: permanentUrl)
print("", newModel)
completion(newModel)
}catch{
print("❌ There was an error in \(#function) \(error) : \(error.localizedDescription)")
}
}.resume()
据我了解,这是将我的 MLModel 保存到 "permanentUrl"。所以我重新启动应用程序,我不再 运行 downloadTask(因为 MLModel 应该被保存?),我尝试使用此代码访问我复制到永久 URL 的 MLModel
let permanentUrl = URL(string:"file:///var/mobile/Containers/Data/Application/659B2FEE-4384-4BBE-97D1-B1575BF1EB3B/Library/Application%20Support/CFNetworkDownload_v3EpLD.mlmodelc")
do {
let model = try MLModel(contentsOf: permanentUrl!)
print(model)
}catch{
print("❌ There was an error in \(#function) \(error) : \(error.localizedDescription)")
}
我收到这个错误
file:///var/mobile/Containers/Data/Application/659B2FEE-4384-4BBE-97D1-B1575BF1EB3B/Library/Application 귑ీƢupport/CFNetworkDownload_v3EpLD.mlmodelc does not exist" UserInfo={NSLocalizedDescription=file:///var/mobile/Containers/Data/Application/659B2FEE-4384-4BBE-97D1-B1575BF1EB3B/Library/Application 귑ీƢupport/CFNetworkDownload_v3EpLD.mlmodelc does not exist} : file:///var/mobile/Containers/Data/Application/659B2FEE-4384-4BBE-97D1-B1575BF1EB3B/Library/Application 귑ీƢupport/CFNetworkDownload_v3EpLD.mlmodelc does not exist
所以我猜 MLModel 没有保存?我在这里错过了什么?我假设我用 downloadTask 保存了 MLModel,但我只是没有以正确的方式检索它。如何访问我保存的文件?
这就是答案。
在 downloadTask 函数中,我打印了 compiledUrl.lastPathComponent 并保存了它。然后,当我重新 运行 应用程序时,我 运行 此代码找到文件的 URL。
// saved compiledUrl.lastPathComponent
let filename = "CFNetworkDownload_B9QvT1.mlmodelc"
let fileManager = FileManager.default
let appSupportDirectory = try! fileManager.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let permanentUrl = appSupportDirectory.appendingPathComponent(filename)
let model = try? MLModel(contentsOf: permanentUrl)
print(model)