3

我使用 busboy connect 从我的客户端获取上传数据。我尝试保存数据,然后 on.finish 将状态 ok 返回给服务器。问题是 on.finish 在文件保存结束之前触发。我做错了什么或者这就是模块的工作方式吗?

服务器端代码:

        console.log("upload started dirname ", __dirname);
        var fstream;
        var result = [];
        var number_of_files = 1;
        req.pipe(req.busboy);
        req.busboy.on('field', function(fieldname, val) {
            field_obj = {}
            field_obj[fieldname] = val;
            result.push(field_obj);
            console.log(field_obj)
        });
        req.busboy.on('file', function(fieldname, file, filename) {
            console.log("Uploading: " + filename);
            //Path where image will be uploaded
            if (result.length > 0) {
                var file_type = filename.substr(filename.length - 4);
                filename = result[0].name + '_' + number_of_files + file_type;
                number_of_files++;
            }
            fstream = fs.createWriteStream(__dirname + "/" + filename);
            file.pipe(fstream);
            fstream.on('close', function() {
                console.log("Upload Finished of " + filename);
                result.push(filename);
                console.log("result ",result)
            });
        });
        req.busboy.on('finish', function() {
            console.log("form parsing finished")
            console.log("result finish",result)
            res.sendStatus(200)
        });

我希望“结果完成”是我看到的最后一个消息,但我在控制台上得到以下信息:

Uploading: testSwf1.swf
Uploading: testSwf3.swf
form parsing finished
result finish [ { name: '123' }, { clickUrl: '234234' } ]
Upload Finished of 123_1.swf
result  [ { name: '123' }, { clickUrl: '234234' }, '123_1.swf' ]
Upload Finished of 123_2.swf
result  [ { name: '123' },
  { clickUrl: '234234' },
  '123_1.swf',
  '123_2.swf' ]

编辑 我也尝试了 on.end 但那一个根本没有被解雇。

req.busboy.on('end', function() {
    console.log("DONE PARSING FORM")
    console.log("NEW result finish", result)
});
4

2 回答 2

3

这是预期的行为。finish当从请求中读取最后一个数据时发出(这包括任何/所有发出file的流,它们是传入请求数据的子集)。

但是,如果您正在将file流写入磁盘,则file流仍有可能将最后一块数据仍缓冲在内存中。finish这就是为什么文件在发出时可能没有完全写入磁盘的原因。

一个常见的解决方案是检查在 busboyfinish事件处理程序中设置的标志,并检查每个 fstream 事件都会增加的计数器变量(例如,close比较它)。result.length

于 2015-08-14T14:54:03.590 回答
3

正如 mscdex 所建议的,我使用一个变量来查找写作完成的时间:

var fstream;
var result = [];
var number_of_files = 1;
var counter = 0; 
req.pipe(req.busboy);
req.busboy.on('field', function(fieldname, val) {
    field_obj = {}
    field_obj[fieldname] = val;
    result.push(field_obj);
    console.log(field_obj)
});
req.busboy.on('file', function(fieldname, file, filename) {
    counter++;
    console.log("Uploading: " + filename);
    //Path where image will be uploaded
    if (result.length > 0) {
        var file_type = filename.substr(filename.length - 4);
        filename = result[0].name + '_' + number_of_files + file_type;
        number_of_files++;
    }
    fstream = fs.createWriteStream(__dirname + "/" + filename);
    file.pipe(fstream);
    fstream.on('close', function() {
        counter--;
        console.log("Upload Finished of " + filename);
        result.push(filename);
        console.log("result ",result)
        if(counter == 0){
            console.log("writing finished");
            res.sendStatus(200);
        }
    });
});
于 2015-08-18T11:56:42.270 回答