2

通过 busboy 上传少量文件时,我遇到了事件问题。我的代码:

app.post('/multiupload', function(req, res) {
    var fstream;
    var files = [];
    var busboy = new Busboy({headers: req.headers});
    busboy.on('file', function (fieldname, file, filename) {
        fstream = fs.createWriteStream(__dirname + '/../static/uploaded/' + filename);
        file.pipe(fstream);
        fstream.on('close', function(){
            console.log('file ' + filename + ' uploaded');
            files.push(filename);
        });
    });

    busboy.on('end', function(){console.log('END')});

    busboy.on('finish', function(){
        console.log('finish, files uploaded ', files);
        res.redirect('back');
    });
    req.pipe(busboy);
});

我的表格(翡翠模板)

form(method="POST", action="/multiupload" name="multiupload_form", enctype="multipart/form-data")
input(type='file' name='multifile', multiple)
input(type="submit" value="Upload!")

事件“结束”只是被忽略,在文件上传中间完成触发。我哪里错了?

服务器控制台报告:

file 111.gz uploaded
file 222.mp4 uploaded
file 333.jpg uploaded
finish, files uploaded  [ '111.gz', '222.mp4', '333.jpg' ]
file 444 uploaded
file 555.jpg uploaded
4

2 回答 2

2

busboy不发出end事件。finish一旦处理了整个请求并且所有file流都已完全读取,就会发出该事件。所以问题是底层文件描述符的关闭发生在finish发出之后发生的下一个滴答声(或左右)中。

如果您需要知道所有文件描述符何时关闭,那么您将需要想出一种方法来跟踪close已发出多少事件。

于 2014-10-08T23:51:12.243 回答
0

当文件事件关闭时调用 close 事件。您可以在文件事件中跟踪文件计数,并可以在关闭事件中使用此计数器来查看所有文件何时上传。

下面是你可以尝试的东西

let counter = 0
busboy.on('file', function (fieldname, file, filename) {
        fstream = fs.createWriteStream(__dirname + '/../static/uploaded/' + filename);
        file.pipe(fstream);
        counter++;
        fstream.on('close', function(){
            counter--;
            console.log('file ' + filename + ' uploaded');
            files.push(filename);
            if(counter == 0){
               res.send({message: "All Files Uploaded", })
            }
        });
 });
    req.pipe(busboy);
于 2021-03-23T09:09:12.297 回答