Как заблокировать загрузку GIF-изображений в Multer? - PullRequest
0 голосов
/ 19 марта 2019

Эта конфигурация мультитера позволяет загружать изображения в формате .gif.Как это решить?Я хочу загрузить только png, jpg, jpeg

Это мой код:

let storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, '/public/images')
    },
    filename: function (req, file, cb) {
        crypto.pseudoRandomBytes(16, function (err, raw) {
            cb(null, raw.toString('hex') + Date.now() + '.' + mime.getExtension(file.mimetype));
        });
    }
});
let upload = multer({
    limits: {
        fileSize: 1000000
    },
    fileFilter: function(req, file, cb) {
        if(!file.originalname.match(/\.(jpg|jpeg|png)$/)){
            return cb('File must be an image.');
        }
        cb(undefined, true);
    },
    storage: storage
});

Маршрут:

app.post('/upload-ad', upload.any(), recaptcha.middleware.verify, (req, res)

1 Ответ

0 голосов
/ 19 марта 2019

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

const request = require("request");
const fs = require("fs");

const options = {
    method: "POST",
    url: "http://localhost:3300/upload-ad",
    headers: {
        "Content-Type": "multipart/form-data"
    },
    formData : {
        "image" : fs.createReadStream("./test.gif")
    }
};

request(options, function (err, res, body) {
    if(err) console.log(err);
    console.log(body);
});

Это работает, потому что в этом случае мы устанавливаем поле Content-Disposition.Я подозреваю, что с вами происходит то, что, возможно, клиент не устанавливает этот заголовок или он был установлен неправильно.Например, если мы изменили имя файла с «test.gif» на «test.jpg», это успешно загрузилось бы, несмотря на то, что на самом деле это изображение в формате GIF.

В моем случае начало загрузки выглядит так:

----------------------------321622124424983663382061
Content-Disposition: form-data; name="image"; filename="test.gif"
Content-Type: image/gif

И все работает так, как положено.

Я бы порекомендовал, возможно, не доверять полю имени файла в POST и фактически проверить, что на самом деле представляет собой изображение, посмотрев назагруженный буфер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...