Alamofire.download() method: Where is the file and did it save successfully?

后端 未结 5 709
无人及你
无人及你 2021-02-02 11:16

The example for using Alamofire.download() works just fine, but there isn\'t any detail in how to access the resulting downloaded file. I can figure out where the file is and wh

相关标签:
5条回答
  • 2021-02-02 11:27

    Here is complete method to download file in different destination with progress

    //MARK: Download methods

    func downloadFile(reqType : RequestType,  urlParam: String,completionHandler: (Double?, NSError?) -> Void) {
    
        let documentsPath = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
        var downloadPath = documentsPath.URLByAppendingPathComponent("downloads")
        var isDirectory: ObjCBool = false
        if NSFileManager.defaultManager().fileExistsAtPath(downloadPath.path!, isDirectory: &isDirectory) {
            if(!isDirectory){
                do {
                    try NSFileManager.defaultManager().createDirectoryAtPath(downloadPath.path!, withIntermediateDirectories: true, attributes: nil)
                }catch  {
                    NSLog("Unable to create directory ")
                }
            }
        }else{
            do {
                try NSFileManager.defaultManager().createDirectoryAtPath(downloadPath.path!, withIntermediateDirectories: true, attributes: nil)
            }catch  {
                NSLog("Unable to create directory ")
            }
    
        }
    
    
        //get the url from GTM
        let urlString = self.getRequestedUrlFromIdentifier(reqType, param: urlParam)
        let destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .UserDomainMask)
        Alamofire.download(.GET, urlString, destination: { (temporaryURL, response) in
    
            let pathComponent = response.suggestedFilename
            downloadPath = downloadPath.URLByAppendingPathComponent(pathComponent!)
            if NSFileManager.defaultManager().fileExistsAtPath(downloadPath.path!) {
                do{
                 try NSFileManager.defaultManager().removeItemAtPath(downloadPath.path!)
                }catch {
    
                }
            }
            return downloadPath
        })            .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
                print(totalBytesRead)
    
                // This closure is NOT called on the main queue for performance
                // reasons. To update your ui, dispatch to the main queue.
                dispatch_async(dispatch_get_main_queue()) {
                    print("Total bytes read on main queue: \(totalBytesRead)")
                }
            }
            .response { request, response, _, error in
                print(response)
                let originalPath = destination(NSURL(string: "")!, response!)
                if let error = error {
                    completionHandler(500000.1 , nil)
                    print("Failed with error: \(error)")
                } else {
                    completionHandler(500000.0 , nil)
                    print("Downloaded file successfully \(downloadPath)")
                }
        }
    
    }
    
    0 讨论(0)
  • 2021-02-02 11:34

    I spent about 8 hours looking for an answer to this one. The solution below works for me, and basically I chain to the download method to display the image. In the example below, I'm downloading the profile image of a user knowing his 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!)
                    }
                }
        }
    
    0 讨论(0)
  • 2021-02-02 11:40

    Swift 2.1 and a little simpler:

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

    Still hard to understand why they are using closures to set the destination path...

    0 讨论(0)
  • 2021-02-02 11:42

    The example on the Alamofire readme file actually has the file path in it, so I grab it with a separate variable to use elsewhere in my code. It is not very elegant and I am hoping there is a way to get that info in the response, but for now, this is getting the job done:

    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!)
            }
     }
    
    0 讨论(0)
  • 2021-02-02 11:43

    This answer from an Alamofire member seems to be the best 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))")
    }
    
    0 讨论(0)
提交回复
热议问题