Фильтр файла с использованием мультитера по типу файла - PullRequest
0 голосов
/ 05 сентября 2018

Я использую модуль multer в nodejs для загрузки некоторых изображений (только в формате tiff и jpg). Я хочу фильтровать и хранить только изображения TIFF и JPG.

Пока я делаю это:

var upload = multer({
     storage: storage,
     fileFilter: function(req, file, cb){
          //---------------------------
          //CHECK IF THE FILE IS IN A CORRECT FORMAT
          //------------------------

          if((file.mimetype == "image/jpeg" || file.mimetype == "image/jpg" || file.mimetype == "image/tiff")){
                //correct format
                return cb(null, true);
           } else{ 
                //wrong format
                return cb(null, false);
           }
}

При использовании этого кода проблема заключается в том, что multer проверяет расширение файла, а не реальный тип файла, который зависит от его кодирования. Я видел, например, что существует какой-то модуль, который проверяет реальный тип файла, например this (я только ищу его в Google, и я не проверял его), но я не могу использовать это модуль в параметре filefilter, потому что в области я имею только метаданные загруженного файла, но не содержимое файла.

1 Ответ

0 голосов
/ 07 сентября 2018

Вы можете использовать mmmagic для определения реального типа контента. Он выполняет проверку данных, а не полагается только на расширения файлов для определения типа контента.

Асинхронное связывание libmagic для node.js для обнаружения типов контента путем проверки данных.

Вам необходимо сохранить файл на диске для mmmagic для проверки содержимого.

'use strict';

let multer = require('multer');
let fs = require('fs-extra');

let UPLOAD_LOCATION = path.join(__dirname, 'uploads');
fs.mkdirsSync(UPLOAD_LOCATION);

let upload = multer({
  storage: multer.diskStorage({
    destination: (req, file, callback) => {
      callback(null, UPLOAD_LOCATION);
    },
    filename: (req, file, callback) => {
      //originalname is the uploaded file's name with extn
      console.log(file.originalname);
      callback(null, file.originalname);
    }
  }),
  fileFilter: function fileFilter(req, file, cb) {

    let mmm = require('mmmagic'),
      Magic = mmm.Magic;

    let magic = new Magic(mmm.MAGIC_MIME_TYPE);
    let fileNameWithLocation = path.join(UPLOAD_LOCATION, file.originalname);

    magic.detectFile(fileNameWithLocation, function (err, mimeType) {
        if (err) {
          cb(err)
        }

        const ALLOWED_TYPES = [
          'image/jpeg',
          'image/jpg',
          'image/tiff'
        ];

        console.log(`mimeType => ${mimeType}`);
        cb(null, ALLOWED_TYPES.includes(mimeType));

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