Проверьте расширение файла перед загрузкой всего файла (node.js)

У меня есть сервер Node.JS, работающий как маршрутизатор, на него можно отправлять почтовые запросы для загрузки файлов, должны быть разрешены только расширения 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/, а затем должен удалить их, если они недействительны. Было бы лучше для производительности, если бы я мог проверить расширение файла до того, как файл будет полностью загружен. Кто-нибудь знает, как? Я безуспешно пробовал гуглить и наткнулся на некоторые ответы, которые неприменимы к Грозному.

РЕДАКТИРОВАТЬ:

Итак, я обнаружил, что это срабатывает ПРЯМО перед его запуском, но он начинает записывать файл, отменяет его или ломает сервер во время этого, что приводит к тому, что весь мой файловый диск несколько раз переписывается, документация действительно плохая, поэтому я не могу найти ничего, что позволит мне "пропустить" файл

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

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

    }
    else{

    }
});

person Strah Behry    schedule 24.05.2016    source источник


Ответы (1)


Я нашел решение в другом сообщении 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, а затем он может его пройти.

person Strah Behry    schedule 24.05.2016
comment
Условие должно быть таким: (part.filename && part.filename.match(...)) В противном случае это не сработает (потому что вы разрешаете работу с безымянными файлами). - person Leonid Dashko; 11.03.2018