2016-04-22 10 views
5

私は、テーブルビューと、各セルの多くのダウンロードボタンで多くのインボイスファイルのリストを取得しました。そのうちの1つをクリックすると、インボイスファイルがダウンロードされます。問題は、私がダウンロードしたすべてのファイルで、ファイルの名前が "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はちょうど私が選択したテーブルビューに手動でファイル名を保存することがresponse.suggestedfilename.Andを使用しているため、コード

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

を使用したくありませんさ誰もがそれをはっきりと見たいので、私は私の質問にいくつかのコードを掲示したことに気をつけてください。

答えて

7

宛先は(NSURL, NSHTTPURLResponse) -> NSURLです。あなたがSWIFT 3.0でこの

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

ような何かを行うことができ、よりAlamofire

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

だより詳細な答えをいただき、ありがとうございます。 –

+0

あなたの歓迎:) – Sahil

+0

スウィフト3.0で同じよ​​うに書く方法は? –

関連する問題