Как отменить загрузку пользователя в Formidable (Node.js)?

Я работаю над этой проблемой уже два дня, и я застрял. Я использую Node.js с Express, и я пытаюсь реализовать форму загрузки. По сути, я хочу, чтобы форма делала следующее:

Проверьте размер файла и отмените загрузку, если он слишком велик (когда я говорю «отмена», я имею в виду предотвратить дальнейшую запись данных на диск и удаление временного файла)

Проверьте тип файла и убедитесь, что это правильный тип (.jpg, .png и т. Д.), Если это не так, прекратите дальнейшую запись на диск и удалите временный файл.

В настоящее время у меня работает загрузка, и я выдаю ошибки, когда файл слишком велик или не соответствует нужному типу, а затем удаляю файл сfs.unlink() после того, как весь файл был записан на диск. Но я вижу потенциальную проблему с таким подходом: что если пользователь загрузит огромный файл (размером в ГБ)? С моим подходом прямо сейчас он будет удален с моей машины, но не после того, как потрачена куча ресурсов. В общем, я хочу использовать минимальное количество ресурсов, чтобы подтвердить, что файл подходит для загрузки. Это код, который я до сих пор:

    var path = absolutePath + '/public/images/users/' + req.session.userId + '/';
    var maxSize = 3146000; // 3MB
    var form = new formidable.IncomingForm();
    form.uploadDir = path;
    form.keepExtensions = true;

    form.on('error', function(message) {
        if(message)
        {
            res.json({err: message});
        }
        else
        {
            res.json({err: 'Upload error, please try again'});
        }
    });

    form.on('fileBegin', function(name, file){
        if(form.bytesExpected > maxSize)
        {
            this.emit('error', 'Size must not be over 3MB');
        }
    });

    form.on('file', function(name, file) {
        var type = file.type;
        type = type.split('/');
        type = type[1];

        if(type != 'jpeg' && type != 'png' && type != 'gif')
        {
            this.emit('error', "JPG's, PNG's, GIF's only");
            fs.unlink(file.path);
        }
        else
        {
            fs.rename(file.path, path + 'profile.' + type);
        }
    });

    form.on('progress', function(bytesReceived, bytesExpected) {
            console.log(bytesReceived); //This is just to view progress
    });

    form.parse(req);

Я также смущен, потому что в соответствии с документами вhttps://github.com/felixge/node-formidable, это говорит:

Запрос, в котором произошла ошибка, автоматически приостанавливается, вам придется вручную вызывать request.resume (), если вы хотите, чтобы запрос продолжал вызывать события data.

Это было бы здорово, но я не могу заставить его работать. Всякий раз, когда я выдаю «ошибку», события «данные» продолжают срабатывать до завершения.

попытки

Я попытался отменить запрос, когда произошла ошибка, но безрезультатно.req.pause() ничего не сделал для меня,req.end() а такжеreq.abort() дал мне ошибку, сказав, что это был не метод, иreq.connection.destroy() а такжеreq.connection.end() только что отправил цикл запросов POST.

Последние мысли

Так что то, что я ищу, кажется, должно быть обычным делом, но последние два дня я потратил на поиски в интернете тщательной реализации, и я не могу ничего найти. Я имею в виду, это просто проверить размер и тип файла ПОСЛЕ всего, что было загружено, но кто хочет тратить все эти ресурсы? Не говоря уже о том, что могли делать злоумышленники.

Я буду продолжать работать, пока не получу именно то, что ищу, но я подумал, что эта проблема может быть актуальна для некоторых других пользователей, и, надеюсь, я смогу получить некоторую помощь!

Спасибо за ваше время.

Ответы на вопрос(7)

Ваш ответ на вопрос