我刚刚在工作中接手了一个新项目。这是一个内部的ExpressJS应用程序,允许员工输入数据。有一项功能允许他们输入工资单调整,但该页面仅允许他们一次输入一个调整并点击提交。他们想要批量上传功能,以便他们可以上传可能进行数百次调整的 CSV 文件。
我有该功能工作,但我使用的文件上传中间件将文件放在临时目录中。我目前正在读取文件,解析调整项目,并在从服务器中删除临时文件之前将调整应用于工资单数据库。这一切都很好用,但我真的很讨厌我在做文件系统 I/O 以及在解析数据时将文件读入内存。
当我了解有关通过 http 传输数据的更多信息时,我意识到应该可以流式传输文件并在项目出现时解析它们。如果是这样,是否有我应该为此目的使用的流行模块?将文件流式传输到服务器并动态解析的最简单方法是什么?
> https://www.npmjs.com/package/busboyhttps://www.npmjs.com/package/fast-csv
var Busboy = require('busboy'); // to handle the form
var csv = require('fast-csv');
function (req, res) {
var busboy = new Busboy({ headers: req.headers });
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
file.pipe(csv())
.on('data', function (data) {
console.log('YAY, just the data I wanted!', data);
});
});
busboy.on('finish', function() {
console.log('Done parsing form!');
res.end();
});
req.pipe(busboy);
}
我知道答案已经被接受,但是在尝试使答案的代码正常工作时,我遇到了很多痛苦。最后,对我来说是这样的,仍然使用 fast-csv
和 busboy
:
var Busboy = require('busboy');
var parser = csv();
function(req, res) {
var busboy = new Busboy({ headers: req.headers });
var result = [];
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
file.on("readable", function () {
var data;
while ((data = file.read()) !== null) {
parser.write(data);
}
})
.on("end", function () {
parser.end();
});
});
parser.on("readable", function () {
var data;
while ((data = parser.read()) !== null) {
//console.log(data);
result.push(data);
}
})
.on("end", function () {
console.log("done:",result);
res.json(result);
});
req.pipe(busboy);
}