简体   繁体   English

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

[英]Download File Using Alamofire 4.0 (Swift 3)

In older version of Alamofire.在旧版本的 Alamofire 中。 This is how I download file这就是我下载文件的方式

    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);
    }

But now in the new version, my code is completely unusable and there is no similar function in the Alamofire library.但是现在在新版本中,我的代码完全无法使用,并且Alamofire库中没有类似的功能。

Any ideas please?请问有什么想法吗?

I used to use this statements:我曾经使用过这样的语句:

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

For more details read more in Alamofire docs about Migration to 4.0 :有关迁移到 4.0 的更多详细信息,请阅读Alamofire 文档中的更多信息:

Swift 4.0斯威夫特 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)")
            }
        }

There are several enhancements in Alamofire 4. The first of which is the optionality of the destination closure. Alamofire 4 中有几项增强功能。第一个是目的地关闭的可选性。 Now, by default, the destination closure is nil which means the file is not moved anywhere on the file system and the temporary URL is returned.现在,默认情况下,目标闭包为零,这意味着文件不会移动到文件系统上的任何位置,并返回临时 URL。

This is the default execution:-这是默认执行:-

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

This is my code to download file with Alamofire 4.0 which return destination Url of file:-这是我使用 Alamofire 4.0 下载文件的代码,它返回文件的目标网址:-

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

Downloading mp3 file with Alamofire 4.0 Swift 4.x使用 Alamofire 4.0 Swift 4.x 下载 mp3 文件

Since almost all samples seems to be about downloading an image or a JSON file, it took me hours to find the right solution.由于几乎所有示例似乎都与下载图像或 JSON 文件有关,因此我花了数小时才找到正确的解决方案。
I will share it here hoping it would help others to save some time.我会在这里分享,希望它能帮助其他人节省一些时间。

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;
}

Swift 3 Alamofire (4.4.0): Swift 3 Alamofire (4.4.0):

.plist add key "App Transport Security Settings->Allow Arbitrary Loads->Yes" if you copy and paste code below:如果您复制并粘贴以下代码,请在 .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)
    }

Use this code for download file使用此代码下载文件

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

        }
    }

For the latest versions this is how it should look like:对于最新版本,它应该是这样的:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM