在上传整个文件(使用formidable和node.js)之前,请验证文件扩展名。

4

我有一个作为路由器的Node.JS服务器,可以通过向其发出POST请求来上传文件,只允许上传jpg/png/jpeg格式的文件。目前我的做法是:

var form = new formidable.IncomingForm(),
    files = [],
    postToFolder,
    source,
    size = 0,
    dest;

postToFolder = '/path/';

form.on('file', function (field, file) {
    var fileType = file.type.split('/').pop();

     if (fileType == 'jpg' || fileType == 'png' || fileType == 'jpeg') {
        // alot of stuff
         }
        else{
            console.log('invalid filetype');
            fs.unlinkSync(file.path);
            console.log('Deleted: ' + file.path);
        }

这段代码可以运行,但它把文件上传到 /tmp/ 文件夹,如果文件无效还必须删除它们。如果我能在文件完全上传之前检查文件扩展名,那么性能将更好。有人知道该怎么做吗?我已经尝试了谷歌搜索,没有结果,并且遇到了一些与 Formidable 不适用的答案。
编辑:我发现这会在开始之前触发,但它确实开始写入文件,取消或在期间中断服务器会导致我的整个文件磁盘多次写满,文档非常糟糕,所以我找不到任何可以让我“跳过”文件的内容。
form.on('fileBegin', function(field, file) {
    var fileType = file.type.split('/').pop();

    if (fileType == 'jpg' || fileType == 'png' || fileType == 'jpeg') {

    }
    else{

    }
});
1个回答

2
我在其他的SO帖子中找到了解决方案,它与答案相同,但由于我特别寻找上传文件之前调用的内容,所以很难找到答案。现在我正在使用的代码(您可以在form.on('file'中删除文件类型检查)。
form.onPart = function (part) {
    if(!part.filename || part.filename.match(/\.(jpg|jpeg|png)$/i)) {
        this.handlePart(part);
    }
    else {
        console.log(part.filename + ' is not allowed');
    }
}

来源 使用express.js和node上传文件,限制扩展名

编辑:我还想指出,这并不禁止用户将.exe重命名为.jpg,然后就可以通过了。


2
条件应该是: (part.filename && part.filename.match(...)) 否则,它将无法工作(因为您允许处理未命名的文件)。 - Leonid Dashko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接