使用Alamofire 4.0下载文件(Swift 3)

在旧版Alamofire中。 这是我下载文件的方式

let destinationPath = Alamofire.Request.suggestedDownloadDestination( directory: .documentDirectory, domain: .userDomainMask); Alamofire.download(.GET, urlString, destination: destinationPath) .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in // print(totalBytesRead) } .response { request, response, _, error in let downloadedFilePath = destinationPath(URL(string: "")!, response!); NSUserDefaultsHelper.saveURL(downloadedFilePath, key: urlString); completion(downloadedFilePath, true); } 

但是现在在新版本中,我的代码完全无法使用,并且Alamofire库中没有类似的function。

有什么想法吗?

我曾经使用过这样的陈述:

 let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory) Alamofire.download( url, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: nil, to: destination).downloadProgress(closure: { (progress) in //progress closure }).response(completionHandler: { (DefaultDownloadResponse) in //here you able to access the DefaultDownloadResponse //result closure }) 

有关更多详细信息,请参阅Alamofire有关迁移到4.0的文档 :

Alamofire 4有几个增强function。第一个是目的地关闭的可选性。 现在,默认情况下,目标闭包为nil,这意味着文件不会移动到文件系统的任何位置,并返回临时URL。

这是默认执行: –

 Alamofire.download(urlString).responseData { response in print("Temporary URL: \(response.temporaryURL)") } 

这是我用Alamofire 4.0下载文件的代码,它返回目标文件的URL: –

 let destination: DownloadRequest.DownloadFileDestination = { _, _ in var documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] documentsURL.appendPathComponent("duck.png") return (documentsURL, [.removePreviousFile]) } Alamofire.download(url, to: destination).responseData { response in if let destinationUrl = response.destinationURL ? { completionHandler(destinationUrl) } } 

Swift 4.0

  let destination: DownloadRequest.DownloadFileDestination = { _, _ in var documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] documentsURL.appendPathComponent("file.csv") return (documentsURL, [.removePreviousFile]) } Alamofire.download(url, to: destination).responseData { response in if let destinationUrl = response.destinationURL { print("destinationUrl \(destinationUrl.absoluteURL)") } } 

Swift 3 Alamofire(4.4.0):

.plist添加密钥“应用程序传输安全设置 – >允许任意负载 – >是”如果您复制并粘贴以下代码:

 import Alamofire let destination = DownloadRequest.suggestedDownloadDestination() Alamofire.download("http://zmp3-mp3-lossless-te-zmp3-bdhcm-1.zadn.vn/151e407bb43f5d61042e/1223048424027738068?key=f-zMo3GZKlhVibnvGMsMuQ&expires=1495726053&filename=See%20You%20Again%20-%20Wiz%20Khalifa%20Charlie%20Puth%20(NhacPro.net).flac", to: destination).downloadProgress(queue: DispatchQueue.global(qos: .utility)) { (progress) in print("Progress: \(progress.fractionCompleted)") } .validate().responseData { ( response ) in print(response.destinationURL!.lastPathComponent) } 

用Alamofire 4.0 Swift 4.x下载mp3文件

由于几乎所有样本似乎都是关于下载图像或JSON文件,因此我花了几个小时才找到正确的解决方案。
我将在此分享,希望能帮助其他人节省一些时间。

 func startDownload(audioUrl:String) -> Void { let fileUrl = self.getSaveFileUrl(fileName: audioUrl) let destination: DownloadRequest.DownloadFileDestination = { _, _ in return (fileUrl, [.removePreviousFile, .createIntermediateDirectories]) } Alamofire.download(audioUrl, to:destination) .downloadProgress { (progress) in self.progressLabel.text = (String)(progress.fractionCompleted) } .responseData { (data) in self.progressLabel.text = "Completed!" } } func getSaveFileUrl(fileName: String) -> URL { let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let nameUrl = URL(string: fileName) let fileURL = documentsURL.appendingPathComponent((nameUrl?.lastPathComponent)!) NSLog(fileURL.absoluteString) return fileURL; } 

使用此代码下载文件

  let fileManager = FileManager.default let directoryURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0] Alamofire.request(\(downloadUrl)).downloadProgress(closure : { (progress) in print(progress.fractionCompleted) }).responseData{ (response) in print(response) print(response.result.value!) print(response.result.description) let randomString = NSUUID().uuidString if let data = response.result.value { let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let videoURL = documentsURL.appendingPathComponent("\(randomString)") do { try data.write(to: videoURL) } catch { print("Something went wrong!") } } }