从浏览器发送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。 这是一步一步回答这个问题。
-
在客户端/浏览器端,无论何时将大文件发送到服务器,都将其转换为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服务器的方式。
- 在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;)