NodeJS处理上传的文件,其中包含readline

时间:2018-05-04 19:04:08

标签: javascript node.js

我通过以下路线获取客户上传的文件:

app.post('/upload', function(req, res){
    var file = req.files.file;

    //Process file inline
    funcs.Process(file, req).then((data)=>{
        //res.setHeader('Content-Length', stat.size);
        res.setHeader('Content-Type', 'text/plain');
        res.setHeader('Content-Disposition', 'attachment; filename=output.txt');
        res.write(data, 'binary');
        res.end();
    }).catch((err)=>{
        res.redirect('/?err='+err);
    });

});

这是funcs.Process的代码:

Process: function(file, req){


    return new Promise(function(resolve, reject){

        var lineReader = require('readline').createInterface({
            input: fs.createReadStream(file)
        });

        var output = "";

        lineReader.on('line', function (line) {
            //some checks
            ProcessLine(line).then((data)=>{
                output += data + "\n";
            }).catch((err)=>{
                reject(`Invalid line in file [${line}].`);
            });
        });

        lineReader.on('close', () => {
            resolve(output);
        });

    });

但是,我收到以下错误:

  

TypeError:path必须是字符串或Buffer,

由readline input: fs.createReadStream(file)

生成

由于这是一个上传的文件,如何在阅读线createInterface

中使用它

1 个答案:

答案 0 :(得分:1)

createReadStream接受字符串路径。

您正在传递req.files.file,即express-fileupload创建的file object

您有两种选择:

  1. 使用mv函数(req.files.file.mv('<path>', callbackFunc))首先将文件移动到服务器上的已知路径。然后将此已知路径传递给fs.createReadStream

  2. 使用streamifier或类似的库直接从req.files.file.data中公开的文件数据缓冲区创建读取流。

  3. var fileStream = require('streamifier').createReadStream(req.files.file.data)

    然后可以直接将此流传递给readline作为输入。