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

时间:2015-05-29 12:50:32

标签: node.js file-upload formidable

我有一个运行withformidable的小函数来接受传入的文件。它就像一个魅力,但我无法在文档中看到有关限制文件类型的任何内容。 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 个答案:

答案 0 :(得分:2)

所以在玩完所有内容之后结果......如果你没有在文件类型不是你想要的时候设置文件路径,这与限制我的文件类型是一样的。

例如:

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

答案 1 :(得分:0)

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

希望有帮助。