如何使用Formidable JS限制文件类型

5
我使用formidable已经实现了一个接收文件的小函数。功能非常好用,但是我在文档中找不到限制文件类型的任何信息。看起来除此之外,几乎所有其他方面都有所涉及。
是否有其他人遇到过这种情况?
Github链接:https://github.com/felixge/node-formidable
        var form = new formidable.IncomingForm(),
            files = [],
            fields = [],
            returnJson = {};

        //setup the incoming
        form.uploadDir = GLOBAL.server_settings.user_content;
        form.encoding = 'utf-8';
        form.maxFieldsSize = 2 * 1024 * 1024;
        form.maxFields = 1000;

        form.on('field', function(field, value) {
            console.log(field, value);
            fields.push([field, value]);
        })
        /* this is where the renaming happens */
        .on ('fileBegin', function(name, file){
            var fileType = file.type.split('/').pop();
            //rename the incoming file
            file.path = form.uploadDir + "/" + req.user.id + _ + toolbox.uniqid() + '.' + fileType;
        })
        .on('file', function(field, file) {
            //on file received
            console.log(field, file);
            files.push([field, file]);
        })
        .on('progress', function(bytesReceived, bytesExpected) {
            //self.emit('progess', bytesReceived, bytesExpected)
            var percent = (bytesReceived / bytesExpected * 100) | 0;
            process.stdout.write('Uploading: %' + percent + '\r');
        })
        .on('end', function() {
            console.log('-> upload done');
            console.log( files );
            console.log( fields );
            returnJson.file_data = files;
            returnJson.fields_data = fields;
            res.json( returnJson );
        });
        form.parse(req);
2个回答

4
所以经过尝试,如果文件类型不是你想要的,只需不设置文件路径,这将与限制我的文件类型相同。
例如:
//event listeners for the form.parse() below
            form.on('field', function(field, value) {
                console.log(field, value);
                fields.push([field, value]);
            })
            /* this is where the renaming happens */
            .on ('fileBegin', function(name, file){
                var fileType = file.type.split('/').pop();
                if(fileType == 'jpg' || fileType == 'png' || fileType == 'jpeg' ){
                    //rename the incoming file
                    file.path = form.uploadDir + "/" + images_hash + '_' + image_count + '.' + fileType;
                    //increment image counter for next possible incoming image
                    ++image_count;
                } else {
                    console.log( 'incorrect file type: ' + fileType );
                }
            })

4
您可以通过在form.onPart()函数中处理来完成。类似这样的内容:
fileTypes = ['image/jpeg', 'image/png', 'image/gif'];

form.onPart = part => {
    if (fileTypes.indexOf(part.mime) === -1) {
        // Here is the invalid file types will be handled. 
        // You can listen on 'error' event
        form._error(new Error('File type is not supported'));
    }
    if (!part.filename || fileTypes.indexOf(part.mime) !== -1) {
        // Let formidable handle the non file-pars and valid file types
        form.handlePart(part);
    }
};

form.parse(request).on('error', _err => {
    // You also pass it through next() to errorHandle function
    debug(_err.message); // output: File type is not supported
})

希望这有所帮助。

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