Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to download file in swift?

I just started learning apple swift programming for iOS coming from android. I basically can now read and manipulate swift code and also learned some common classes used in iOS swift programming but still having some confusion with the syntax and everything.

I'm trying to download file. Like, lets just say coming from this URL

var url = "http://www.mywebsite.com/myfile.pdf" 

in a button click. Maybe with visual progress too

Through searching here in stackoverflow, I stumbled upon Alamofire. I might try it but I'm not sure if this is the best way for me to do it.

So, I would like to ask how and what are my options (iOS7 and iOS8) in achieving my goal. Also, pros and cons would be awesome!

like image 421
r_19 Avatar asked Jan 29 '15 16:01

r_19


1 Answers

Example downloader class without Alamofire:

class Downloader {     class func load(URL: NSURL) {         let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()         let session = NSURLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil)         let request = NSMutableURLRequest(URL: URL)         request.HTTPMethod = "GET"         let task = session.dataTaskWithRequest(request, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in             if (error == nil) {                 // Success                 let statusCode = (response as NSHTTPURLResponse).statusCode                 println("Success: \(statusCode)")                  // This is your file-variable:                 // data             }             else {                 // Failure                 println("Failure: %@", error.localizedDescription);             }         })         task.resume()     } } 

This is how to use it in your own code:

class Foo {     func bar() {         if var URL = NSURL(string: "http://www.mywebsite.com/myfile.pdf") {             Downloader.load(URL)         }     } } 

Swift 3 Version

Also note to download large files on disk instead instead in memory. see `downloadTask:

class Downloader {     class func load(url: URL, to localUrl: URL, completion: @escaping () -> ()) {         let sessionConfig = URLSessionConfiguration.default         let session = URLSession(configuration: sessionConfig)         let request = try! URLRequest(url: url, method: .get)          let task = session.downloadTask(with: request) { (tempLocalUrl, response, error) in             if let tempLocalUrl = tempLocalUrl, error == nil {                 // Success                 if let statusCode = (response as? HTTPURLResponse)?.statusCode {                     print("Success: \(statusCode)")                 }                  do {                     try FileManager.default.copyItem(at: tempLocalUrl, to: localUrl)                     completion()                 } catch (let writeError) {                     print("error writing file \(localUrl) : \(writeError)")                 }              } else {                 print("Failure: %@", error?.localizedDescription);             }         }         task.resume()     } } 
like image 69
Devran Cosmo Uenal Avatar answered Sep 22 '22 02:09

Devran Cosmo Uenal