Customizing the name of the custom Alamofire target file instead of using suggestDownloadDestination

I got a lot of invoice file lists in my table view, as well as a lot of download buttons in each cell. When I clicked one of them, it will load the invoice file. But the problem is that the suggested server name is indicated by the server "invoice.pdf" in every file that I downloaded. Therefore, I need to manually edit the file name before I save it in the document after downloading it. So, how to edit the file name manually after it was successfully downloaded and save it in the document as temporary, 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 a table view that will check the downloaded file, and when it clicks, it is displayed in the open function.

 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 this code

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

because it uses response.sposedfilename.And I want to save the file name manually in the selected data of the table cell. Any help? Please do not mind that I posted the code in my question, because I want everyone to see it clearly.

+5
source share
1 answer

The 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 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) } } 

to go more to Alamofire

+7
source

Source: https://habr.com/ru/post/1247682/


All Articles