设置Alamofire自定义目标文件名而不是使用suggestedDownloadDestination

问题描述:

我在我的表格视图中获得了许多发票文件列表以及每个单元格上的许多下载按钮。当我单击其中一个时,它将下载发票文件。但是,问题是服务器响应的建议文件名是“invoice.pdf”,在我下载的每个文件中。所以,我需要手动编辑文件名,然后才能在下载文件之前保存文件。所以,如何手动编辑文件名在成功下载并将其作为临时文档保存在文档中后,不需要使用Alamofire.Request.suggestedDownloadDestination设置Alamofire自定义目标文件名而不是使用suggestedDownloadDestination

这是我的下载功能。

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

这里是要去检查下载的文件,当单击时,显示在功能打开表视图。

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

所以,我的问题是simple.I只是不想使用该代码

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

,因为它使用response.suggestedfilename.And我想手动保存文件名上选择表视图细胞数据。任何帮助?请不要介意我在我的问题中发布了一些代码,因为我希望每个人都清楚地看到它。

目的地类型为(NSURL, NSHTTPURLResponse) -> NSURL。所以你可以做这样的事情

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

雨燕3.0

在SWIFT 3.0是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) 
    } 
} 

更多的转到Alamofire

+0

感谢您详细解答。 –

+0

欢迎:) – Sahil

+0

如何在swift 3.0中编写相同的代码? –