Как загрузить файл в Alamofire 4 и сохранить в каталоге документов?

Я пытаюсь использовать Alamofire4 на Swift3. Мне нужно скачать .mp3 файлы и сохраните их в

3 ответов


почему вы выступаете .validate? Вы не сохраняете данные после загрузки в текущем коде. Alamofire позволяет хранить файл непосредственно после загрузки:

let destination: DownloadRequest.DownloadFileDestination = { _, _ in
    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let fileURL = documentsURL.appendPathComponent("pig.png")

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

Alamofire.download(urlString, to: destination).response { response in
    print(response)

    if response.result.isSuccess, let imagePath = response.destinationURL?.path {
        let image = UIImage(contentsOfFile: imagePath)
    }
}

и, кстати, путь загрузки, который вы предоставляете в download метод-это локальный URL-адрес каталога документов, а не URL-адрес сервера.


Swift 3.x и Alamofire 4.X версии

и Alamofire пример написал сам Alamofire есть ошибки. С fileURL возвращает Void его нельзя использовать в качестве параметра в инструкции return.

удалить .createIntermediateDirectories из списка опций инструкции return, если вы не хотите никаких каталогов для загруженного файла

редактировать
Если вы хотите узнать тип файла, просто возьмите последнюю компонентную часть и конвертируйте String to NSString as NSString эти функции.

//audioUrl should be of type URL
let audioFileName = String((audioUrl?.lastPathComponent)!) as NSString

//path extension will consist of the type of file it is, m4a or mp4
let pathExtension = audioFileName.pathExtension

let destination: DownloadRequest.DownloadFileDestination = { _, _ in
    var documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]

    // the name of the file here I kept is yourFileName with appended extension
    documentsURL.appendPathComponent("yourFileName."+pathExtension)
    return (documentsURL, [.removePreviousFile])
}

Alamofire.download("yourAudioUrl", to: destination).response { response in
            if response.destinationURL != nil {
                print(response.destinationURL!)
            }
        }

выход

file:///Users/rajan/Library/Developer/CoreSimulator/Devices/92B4AB6E-92C0-4864-916F-9CB8F9443014/data/Containers/Data/Application/781AA5AC-9BE7-46BB-8DD9-564BBB343F3B/Documents/yourFileName.mp3

это реальный путь файла, где он хранится.


цель: загруженные файлы с сервера, такие как gif, pdf или zip, будут храниться внутри указанного имени папки.

Если вы хотите сохранить свою собственную структуру папок, как имя "ZipFiles"

звонок .

self downloadZipFileFromServer(downloadFolderName: "ZipFiles");

загруженные zip-данные хранятся внутри документа / ZiFiles / abc.zip

это просто создает папку внутри документа

func createFolder (имя папки:строка)

Alamofire 4
Swift 4
/******Download image/zip/pdf  from the server and save in specific Dir********/
func downloadZipFileFromServer(downloadFolderName: string)
{
    let destination: DownloadRequest.DownloadFileDestination = { _, _ in
        var fileURL = self.createFolder(folderName: downloadFolderName)
        let fileName = URL(string : "www.xymob.com/abc.zip")
        fileURL = fileURL.appendingPathComponent((fileName?.lastPathComponent)!)
        return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
    }
    Alamofire.download("www.xymob.com/abc.zip", to: destination).response(completionHandler: { (DefaultDownloadResponse) in                
        print("res ",DefaultDownloadResponse.destinationURL!);
    })
}        

func createFolder(folderName:String)->URL
{
    var paths: [Any] = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
    let documentsDirectory: String = paths[0] as? String ?? ""
    let dataPath: String = URL(fileURLWithPath: documentsDirectory).appendingPathComponent(folderName).absoluteString
    if !FileManager.default.fileExists(atPath: dataPath) {
        try? FileManager.default.createDirectory(atPath: dataPath, withIntermediateDirectories: false, attributes: nil)
    }
    let fileURL = URL(string: dataPath)
    return fileURL!
}