如何在ExpressJS中逐行上传和读取大文件



我正在尝试将一个大文件上传到Express,并且我能够使用express-fileupload中间件成功读取文件对象,如下所示。

{
myfile: {
name: 'somelargefile.txt',
data: <Buffer /* details truncated */ ... 110075790 more bytes>,
size: 110075840,
encoding: '7bit',
tempFilePath: '',
truncated: false,
mimetype: 'text/plain',
md5: '/* details truncated */',
mv: [Function: mv]
}
}

但是,如果我将整个文件保存到files对象中,express可能会占用大量内存。如何从请求对象逐行读取文件,就像使用流一样?

对于大文件,readFileSync可能不方便,因为它会在内存中加载整个文件。另一种不同的同步方法是迭代调用readSync,一次读取少量数据,并在行到来时对其进行处理。

例如:

var fs = require('fs');
var filename = 'test.txt'
var fd = fs.openSync(filename, 'r');
var bufferSize = 1024;
var buffer = new Buffer(bufferSize);
var leftOver = '';
var read, line, idxStart, idx;
while ((read = fs.readSync(fd, buffer, 0, bufferSize, null)) !== 0) {
leftOver += buffer.toString('utf8', 0, read);
idxStart = 0
while ((idx = leftOver.indexOf("n", idxStart)) !== -1) {
line = leftOver.substring(idxStart, idx);
console.log("one line read: " + line);
idxStart = idx + 1;
}
leftOver = leftOver.substring(idxStart);
}

最新更新