2016-07-20 51 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