Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting Alamofire custom destination file name instead of using suggestedDownloadDestination

I got many lists of invoice file at my table view as well as many download buttons at each cell.When I clicked one of it,it will download the invoice file.But,the problem is the server response suggested file name is "invoice.pdf" at every file I downloaded.So,I need to edit the file name manually before I save to document after it was downloaded.So,how to edit the file name manually after it was download successfully and save it in document as temporaryurl without using Alamofire.Request.suggestedDownloadDestination.

Here is my download function.

func downloadInvoice(invoice: Invoice, completionHandler: (Double?, NSError?) -> Void) {

guard isInvoiceDownloaded(invoice) == false else {
  completionHandler(1.0, nil) // already have it
  return
}

let params = [
    "AccessToken" : “xadijdiwjad12121”]

// Can’t use the destination file anymore because my server only return one file name “invoice.pdf” no matter which file i gonna download
// So I have to manually edit my file name which i saved after it was downloaded.    
let destination = Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory, domain: .UserDomainMask)
// So I have to save file name like that ““2016_04_02_car_invoice_10021.pdf” [Date_car_invoice_timestamp(Long).pdf]
// Please look comment on tableView code

Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders?.updateValue("application/pdf",forKey: "Content-Type")

Alamofire.download(.POST, invoice.url,parameters:params, destination: destination)
      .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
        print(totalBytesRead)
        dispatch_async(dispatch_get_main_queue()) {
          let progress = Double(totalBytesRead) / Double(totalBytesExpectedToRead)
          completionHandler(progress, nil)
        }
      }
      .responseString { response in
        print(response.result.error)
        completionHandler(nil, response.result.error)
    }
  }

Here is the table view which gonna check downloaded file and when it click,shown on open in feature.

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if let invoice = dataController.invoices?[indexPath.row] {
  dataController.downloadInvoice(invoice) { progress, error in
    // TODO: handle error
    print(progress)
    print(error)
    if (progress < 1.0) {
      if let cell = self.tableView.cellForRowAtIndexPath(indexPath), invoiceCell = cell as? InvoiceCell, progressValue = progress {
        invoiceCell.progressBar.hidden = false
        invoiceCell.progressBar.progress = Float(progressValue)
        invoiceCell.setNeedsDisplay()
      }
    }
    if (progress == 1.0) {
    // Here where i gonna get the downloaded file name from my model.
        // invoice.filename = (Assume “2016_04_02_car_invoice_10021”)
        if let filename = invoice.filename{
            let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
            let docs = paths[0]
            let pathURL = NSURL(fileURLWithPath: docs, isDirectory: true)
            let fileURL = NSURL(fileURLWithPath: filename, isDirectory: false, relativeToURL: pathURL)

            self.docController = UIDocumentInteractionController(URL: fileURL)
            self.docController?.delegate = self
            if let cell = self.tableView.cellForRowAtIndexPath(indexPath) {
                self.docController?.presentOptionsMenuFromRect(cell.frame, inView: self.tableView, animated: true)
                if let invoiceCell = cell as? InvoiceCell {
                    invoiceCell.accessoryType = .Checkmark
                    invoiceCell.setNeedsDisplay()
                }
            }
        }
    }
  }
}
}

So,my question is simple.I just don't want to use that code

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

because it use response.suggestedfilename.And I want to save file name manually on selected table view cell data.Any Help?Please don't mind that I posted some code in my question because I want everyone to see it clearly.

like image 567
Thiha Aung Avatar asked Apr 22 '16 05:04

Thiha Aung


1 Answers

Destination is of type (NSURL, NSHTTPURLResponse) -> NSURL. so you can do something like this

 Alamofire.download(.POST, invoice.url,parameters:params, destination: { (url, response) -> NSURL in

    let pathComponent = "yourfileName"

    let fileManager = NSFileManager.defaultManager()
    let directoryURL = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
    let fileUrl = directoryURL.URLByAppendingPathComponent(pathComponent)
    return fileUrl
    })
  .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
    print(totalBytesRead)
    dispatch_async(dispatch_get_main_queue()) {
      let progress = Double(totalBytesRead) / Double(totalBytesExpectedToRead)
      completionHandler(progress, nil)
    }
    }
    .responseString { response in
      print(response.result.error)
      completionHandler(nil, response.result.error)
  }
}

Swift 3.0

in swift 3.0 it's DownloadFileDestination

 Alamofire.download(url, method: .get, to: { (url, response) -> (destinationURL: URL, options: DownloadRequest.DownloadOptions) in
  return (filePathURL, [.removePreviousFile, .createIntermediateDirectories])
})
 .downloadProgress(queue: utilityQueue) { progress in
    print("Download Progress: \(progress.fractionCompleted)")
}
.responseData { response in
    if let data = response.result.value {
        let image = UIImage(data: data)
    }
}

for more go to the Alamofire

like image 170
Sahil Avatar answered Oct 14 '22 06:10

Sahil