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