从浏览器发送CSV文件到nodejs服务器

我试图发送一个由用户上传的csv文件,从浏览器到nodejs服务器进行处理(文件超过50 MB,因此页面无响应)。 我为此使用XMLHttpRequest。 我无法find解决办法。 任何帮助表示赞赏。

Javascript代码

var csv = document.getElementById('inputFile').files[0]; var request = new XMLHttpRequest(); request.open("POST", "/handleFile", true); request.setRequestHeader("Content-type", "text/csv"); request.onreadystatechange = function() { if (request.readyState === XMLHttpRequest.DONE && request.status === 200) { console.log("yey"); } } request.send(csv); 

NodeJS服务器

  var express = require('express') var app = express() var bodyparser = require('body-parser') app.post('/handleFile', function(req, res) { console.log(req.body); // getting {} empty object here.... console.log(req); var csv = req.body; var lines = csv.split("\n"); var result = []; var headers = lines[0].split("\t"); for (var i = 1; i < lines.length; i++) { var obj = {}; var currentline = lines[i].split("\t"); for (var j = 0; j < headers.length; j++) { obj[headers[j]] = currentline[j]; } result.push(obj); } fileData = result; }); 

我做错了什么? XMLHttpRequest使用不正确? 还是还有一些我不明白的东西? 为什么req.body中没有数据,即使它是一个post请求。 还是有任何其他的方式从前端发送一个CSV /文本文件到nodejs服务器。

这个问题不是重复的,因为body-parser,即负责parsingreq.body的中间件不处理text / csv和multipart / form-data。 上述链接不是正确的解决scheme。

所以,环顾四周,我发现问题不是我的XMLHttpRequest。 服务器收到的请求很好,但body-parser无法parsingtext / csv和multipart / form-data内容types。 这是一步一步回答这个问题。

  1. 在客户端/浏览器端,无论何时将大文件发送到服务器,都将其转换为multipart / form-data。 这是发送文本/ csv / anyfile到服务器的正确方法。

     var csv=document.getElementById('inputFile').files[0]; var formData=new FormData(); formData.append("uploadCsv",csv); var request = new XMLHttpRequest(); //here you can set the request header to set the content type, this can be avoided. //The browser sets the setRequestHeader and other headers by default based on the formData that is being passed in the request. request.setRequestHeader("Content-type", "multipart/form-data"); //----(*) request.open("POST","/handleFile", true); request.onreadystatechange = function (){ if(request.readyState === XMLHttpRequest.DONE && request.status === 200) { console.log("yey"); } } request.send(formData); 

所以,这就是你将http请求发送到nodejs服务器的方式。

  1. 在Node js服务器上:通常对于application / json或任何其他请求types,body-parser可以正常工作。 但是对于大数据和文件,即multipart / form-data body-parser不能parsingreq.body。 因此它会将req.body作为{}(空对象)。 在这里阅读关于body-parser的内容。

所以对于这些内容types,您可以使用其他中间件来处理请求。 有些是多function ,多派,公务员等。 这是代码snipet。

  //EXPRESS var express = require('express') var app = express() var config=require('./config.js'); //multer var multer = require('multer'); var upload = multer(); app.post('/handleFile',upload.single('uploadCsv'), function(req, res, next) { // req.file is the `uploadCsv` file // req.body will hold the text fields, if there were any console.log(req.file); // the buffer here containes your file data in a byte array var csv=req.file.buffer.toString('utf8'); }); 

注:这仍然会给你在nodejs服务器的错误。 提示:它与行(*)有关。 尝试删除它,看看会发生什么。 谷歌rest;)