如何用强大的js限制文件类型

how to restrict file types with formidable js

我有一个小功能运行 可以接受传入的文件。它就像一个魅力,但我在文档中看不到有关限制文件类型的任何地方。 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);

所以在玩弄之后发现.. 如果你只是在文件类型不是你想要的时候不设置文件路径,这与限制我的文件类型是一样的。

例如:

//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 );
                }
            })

您可以通过在 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
})

希望对您有所帮助。