36

在旧版本的 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 库中也没有类似的功能。

请问有什么想法吗?

4

7 回答 7

58

我曾经使用过这样的语句:

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的更多信息:

于 2016-10-07T08:48:00.843 回答
17

斯威夫特 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)")
            }
        }
于 2018-04-04T06:44:55.777 回答
15

Alamofire 4 中有几个增强功能。其中第一个是目的地关闭的可选性。现在,默认情况下,目标闭包为 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)
    }
}
于 2016-12-28T06:49:51.233 回答
11

使用 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;
}
于 2018-01-28T11:26:01.227 回答
7

对于最新版本,它应该是这样的:

let destination: DownloadRequest.Destination = { _, _ in
        let documentsURL = FileManager.default.urls(for: .picturesDirectory, in: .userDomainMask)[0]
            let fileURL = documentsURL.appendingPathComponent("image.png")

            return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
    }

    AF.download("https://httpbin.org/image/png", to: destination).response { response in
        debugPrint(response)

        if response.error == nil, let imagePath = response.fileURL?.path {
            let image = UIImage(contentsOfFile: imagePath)
        }
    }
于 2020-05-31T15:35:56.043 回答
5

斯威夫特 3 Alamofire (4.4.0):

.plist 添加键“App Transport Security Settings->Allow Arbitrary Loads->Yes”,如果您复制并粘贴以下代码:

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)
    }
于 2017-05-24T15:34:25.087 回答
4

使用此代码下载文件

     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!")
            }

        }
    }
于 2018-05-30T09:27:06.757 回答