2016-07-20 54 views
0

我試圖得到 - 一些承諾已經執行後 - 一個CSV結果與一個狀態響應一起有詳細信息。NodeJS - 提示下載CSV文件

響應確實爲我提供了CSV的數據,但似乎無法讓瀏覽器將此數據下載到CSV文件中。

router.post('/getSalesOrders', function (request, response) { 
    var data = request.body; 
    salesOrderActions.retrieveSalesOrders(data) // 
     .then(function (result) { 
      response.setHeader('Content-disposition', 'attachment; filename=testing.csv'); 
      response.set('Content-Type', 'text/csv'); 
      response.json(result[0].message).send(result[0].file); 
     }) 
     .catch(function (err) { 
      console.log(err); 
      if (err.statusCode) { 
       response.json(err); 
      } 
      else { 
       var error = output.getCriticalErrorResult(c.titles.SERVICE_CRITICAL_ERROR, c.messages.UNKNOWN_ERROR, err.message); 
       response.json(error); 
      } 
     }); 
}); 

我的結果對象獲取的salesOrderActions創建:

我在這裏使用NPM包json2csv

var fields = ['id',.....]; 
var csv = csvParser({ data: unmatchedLines, fields: fields }); 

return { 
    file: csv, 
    message: 
     output.getSuccessResult(
      titles.SALES_ORDER_SUCCESS_RETRIEVAL, 
      salesDataForModel.identifier 
     ) 
} 

我到瀏覽器的迴應如下: enter image description here enter image description here

所以我的消息似乎並沒有發送s and我確實得到了CSV數據,但不能作爲要下載的文件。 我該如何管理?

一點題外話,也許,我的前端是React

編輯

響應與octed標題:

enter image description here enter image description here

回答

0

所以事實證明,這是因爲我正在做一個Ajax請求,它不會 - 默認情況下 - 提示瀏覽器下載任何文件。

我到底做了:

router.post('/getSalesOrders', function (request, response) { 
    var data = request.body; 
    salesOrderActions.retrieveSalesOrders(data) 
     .then(function (result) { 
      response.json(result); 
     }) 
     .catch(function (err) { 
      //... 
     }); 
}); 

然後在我的前端,接收結果時:

salesOrderService.retrieveSalesOrderData() 
.then(function (result) { 
    self.convertAndDownloadCsv(result.unmatchedLines); 
}); 

convertAndDownloadCsv: function (data) { 
    if (data && data.length > 0) { 
     var csvData = csvProcessor({ //using csv2json node js package 
      data: data, 
      quotes: '', 
      del: ';' 
     }); 
     var filename = "unmatchedLinesFromSalesOrders.csv"; 
     var blob = new Blob([csvData], { type: 'text/csv;charset=utf-8;' }); 
     if (navigator.msSaveBlob) { // IE 10+ 
      navigator.msSaveBlob(blob, filename); 
     } else { 
      var link = document.createElement("a"); 
      if (link.download !== undefined) { // feature detection 
       // Browsers that support HTML5 download attribute 
       var url = URL.createObjectURL(blob); 
       link.setAttribute("href", url); 
       link.setAttribute("download", filename); 
       link.style.visibility = 'hidden'; 
       document.body.appendChild(link); 
       link.click(); 
       document.body.removeChild(link); 
      } 
     } 
    } 
} 

More info can be found here

0

試試這個代碼:

router.post('/getSalesOrders', function (request, response) { 
    var data = request.body; 
    var fs = require('fs'); 

    salesOrderActions.retrieveSalesOrders(data) // 
    .then(function (result) { 
     //********** 
     var file = "testing.csv"; 
     response.setHeader('Content-disposition', 'attachment; filename=testing.csv'); 
     response.set('Content-Type', 'text/csv'); 
     var filestream = fs.createReadStream(file); 
     filestream.pipe(res); 
     //********* 
    }) 
    .catch(function (err) { 
     console.log(err); 
     if (err.statusCode) { 
      response.json(err); 
     } 
     else { 
      var error = output.getCriticalErrorResult(c.titles.SERVICE_CRITICAL_ERROR, c.messages.UNKNOWN_ERROR, err.message); 
      response.json(error); 
     } 
    }); 
}); 
+0

這是給我同樣的結果,我可以在響應中看到CSV數據,但沒有下載文件... – Tikkes

+0

你可以試試這個:res.setHeader('Content-type','application/octet-stream'); – Ediruth

0

嘗試:

  • 發送的Content-Type內容處置
  • 之前引用的文件名:文件名= 「testing.csv」

而且HTTP標頭是不區分大小寫,因此它不應該有所作爲,但你應該寫內容處置(大寫D)。

response.set('Content-Type', 'text/csv'); 

response.setHeader('Content-Disposition', 'attachment; filename="testing.csv"'); 

如果這不起作用,你可以將內容類型更改爲應用程序/八位字節流

這總是迫使瀏覽器下載從服務器發送的數據。

+0

爲內容處置,沒有問題,我用它與一個小'd'處置項目。但對於應用程序/操作流你是對的 – Ediruth

+0

仍然得到相同的結果。響應包含csv數據,但不會啓動下載。 – Tikkes

+0

即使您使用application/octet-stream作爲Content-type? response.set('Content-Type','application/octet-stream'); – filippo