Alamofire.download()方法:文件在哪里并成功保存?

时间:2014-10-10 19:59:32

标签: alamofire

使用Alamofire.download()的示例工作得很好,但是没有关于如何访问生成的下载文件的任何细节。我可以根据我设置的目标和我做的原始文件请求找出文件的位置和命名内容,但我认为有一个值我应该能够访问以获得完整的最终下载路径和响应中的文件名。

如何访问文件名,如何知道文件是否成功保存?我可以在实际的Alamofire代码中看到代理方法,它们似乎处理下载过程的委托完成调用,但是我如何/可以访问.response块中的文件详细信息?

5 个答案:

答案 0 :(得分:25)

Swift 2.1,有点简单:

var localPath: NSURL?
Alamofire.download(.GET,
    "http://jplayer.org/video/m4v/Big_Buck_Bunny_Trailer.m4v",
    destination: { (temporaryURL, response) in
        let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
        let pathComponent = response.suggestedFilename

        localPath = directoryURL.URLByAppendingPathComponent(pathComponent!)
        return localPath!
})
    .response { (request, response, _, error) in
        print(response)
        print("Downloaded file to \(localPath!)")
}

仍然很难理解为什么他们使用闭包来设置目标路径......

答案 1 :(得分:13)

Alamofire自述文件中的示例实际上有文件路径,因此我使用单独的变量来获取它以在我的代码中的其他地方使用。它不是很优雅,我希望有一种方法可以在响应中获取该信息,但是现在,这已经完成了工作:

var fileName: String?
var finalPath: NSURL?

Alamofire.download(.GET, urlToCall, { (temporaryURL, response) in

    if let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as? NSURL {    

        fileName = response.suggestedFilename!
        finalPath = directoryURL.URLByAppendingPathComponent(fileName!)
        return finalPath!
    }

    return temporaryURL
})
    .response { (request, response, data, error) in

        if error != nil {
            println("REQUEST: \(request)")
            println("RESPONSE: \(response)")
        } 

        if finalPath != nil {
            doSomethingWithTheFile(finalPath!, fileName: fileName!)
        }
 }

答案 2 :(得分:3)

我花了大约8个小时寻找这个答案。下面的解决方案对我有用,基本上我链接到下载方法来显示图像。在下面的示例中,我正在下载知道其Facebook ID的用户的个人资料图片:

    let imageURL = "http://graph.facebook.com/\(FBId!)/picture?type=large"

    let destination: (NSURL, NSHTTPURLResponse) -> (NSURL) = {
        (temporaryURL, response) in

        if let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as? NSURL {
            var localImageURL = directoryURL.URLByAppendingPathComponent("\(self.FBId!).\(response.suggestedFilename!)")
            return localImageURL
        }
        return temporaryURL
    }

    Alamofire.download(.GET, imageURL, destination).response(){
        (_, _, data, _) in
            if let directoryURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as? NSURL {
                var error: NSError?
                let urls = NSFileManager.defaultManager().contentsOfDirectoryAtURL(directoryURL, includingPropertiesForKeys: nil, options: nil, error: &error)

                if error == nil {
                    let downloadedPhotoURLs = urls as! [NSURL]
                    let imagePath = downloadedPhotoURLs[0] // assuming it's the first file
                    let data = NSData(contentsOfURL: imagePath)
                    self.viewProfileImage?.image = UIImage(data: data!)
                }
            }
    }

答案 3 :(得分:2)

以下是使用进度

在不同目的地下载文件的完整方法

// MARK:下载方法

regexMatcher

答案 4 :(得分:2)

来自Alamofire成员的{p> This answer似乎是最好的答案:

let destination = Alamofire.Request.suggestedDownloadDestination(
    directory: .CachesDirectory,
    domain: .UserDomainMask
)

Alamofire.download(.GET, "http://www.adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf", destination: destination)
    .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
        print(totalBytesRead)
    }
    .response { request, response, _, error in
        print(response)
        print("fileURL: \(destination(NSURL(string: "")!, response))")
}