2016-10-07 4 views
7

В старой версии Alamofire. Это как загрузить файлСкачать файл с помощью Alamofire 4.0 (Swift 3)

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.

Любые идеи, пожалуйста?

+3

Когда я Google 'Загрузка файла с помощью Alamofire 4.0 (Swift 3)', я получаю ссылку на официальную документацию Alamofire, которая имеет [пример] (https://github.com/Alamofire/Alamofire#downloading- data-to-file) о том, как загрузить файл. Разве это не полезно? –

ответ

21

я использовать эти заявления:

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 docs about Migration to 4.0:

+0

Блок кода внутри ответа DefaultDownloadResponse, у меня возникла проблема с получением окончательного «загруженногоFilePath» – JayVDiyk

+0

Фактический загруженный путь к файлу - «destination + nameOfTheFile», не так ли? – pedrouan

+0

да, но если вы посмотрите на мой код, имя файла автоматически создается Alamofire. Вот почему я использовал функцию destinationPath для получения полного пути. – JayVDiyk

6

Есть несколько улучшений в 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) 
    } 
} 
+0

Почему вы используете 'документыURL, [.removePreviousFile]' –

3

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

Загрузка mp3 файл с Alamofire 4.0 Swift 4.x

Поскольку почти все образцы, кажется, о загрузке изображения или файла 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; 
} 
Смежные вопросы