Как проверить расширение файла с промежуточным ПО Multer - PullRequest
1 голос
/ 26 февраля 2020

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

Пример: если кто-то переименует filename.exe в filename.png, то он все равно будет подтвержден для загрузки.

Можете ли вы предложить мне решение для решения этой проблемы? Спасибо

Я использовал, как это, но нужно проверить реальные Ext файлов

fileFilter: async function (req, file, callback) {
    var ext = path.extname(file.originalname);
    if(ext !== '.png' && ext !== '.jpg' && ext !== '.gif' && ext !== '.jpeg' && ext !== '.zip') {
        return callback(new Error('Only images and zip are allowed'));
    }
    // I want next function to validate real ext of files here. 
    callback(null, true); 
  },

Ответы [ 3 ]

1 голос
/ 26 февраля 2020

Эта статья поможет вам

www.positronx.io/multer-file-type-validation-tutorial-with-example
1 голос
/ 26 февраля 2020

Необходимо проверить как расширение, так и тип MIME загруженного параметра. Вот пример кода.

const storage = multer.diskStorage({
    destination: './uploadedContent',
    filename: function(_req, file, cb){

      cb(null,file.fieldname + '-' + Date.now() + path.extname(file.originalname));
    } 
  });
var upload = multer({
    storage: storage,
    limits: {
        fields: 5,
        fieldNameSize: 50, // TODO: Check if this size is enough
        fieldSize: 20000, //TODO: Check if this size is enough
        // TODO: Change this line after compression
        fileSize: 15000000, // 150 KB for a 1080x1080 JPG 90
    },
    fileFilter: function(_req, file, cb){
        checkFileType(file, cb);
    }
}).single('postPicture');
function checkFileType(file, cb){
  // Allowed ext
  const filetypes = /jpeg|jpg|png|gif/;
  // Check ext
  const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
  // Check mime
  const mimetype = filetypes.test(file.mimetype);

  if(mimetype && extname){
    return cb(null,true);
  } else {
    cb('Error: Images Only!');
  }
}

Не забудьте также проверить права доступа к своим файлам. Вы не хотите, чтобы загруженный файл выполнялся каким-либо образом.

1 голос
/ 26 февраля 2020

В основном вам нужно что-то, что может проверить расширение с оригинальным типом файла.

Скопировано из блога

    var upload = multer({
  storage: storage,
  fileFilter: (req, file, cb) => {
    if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || file.mimetype == "image/jpeg") {
      cb(null, true);
    } else {
      cb(null, false);
      return cb(new Error('Only .png, .jpg and .jpeg format allowed!'));
    }
  }
});

Ссылка на блог

Если это не сработает, рассмотрите возможность использования отдельного модуля для проверки файла введите из буфера данных.

...