Проверка файла с использованием Multer - Expressjs - PullRequest
0 голосов
/ 04 марта 2020

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

name = 'john doe'
location = 'Some location'
image = (binary)

Мой вопрос заключается в том, как проверить этот файл изображения для обоих времен, т.е. СОЗДАТЬ И ОБНОВИТЬ.

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

router.post('/user', upload.single('image'), userRoute);

Я сделал промежуточное ПО как это, но это не дает должного результата проверки. Давайте предположим, что пользователь выбрал изображение и нажал кнопку отправки, тогда я получу подобное в req.file.

{ fieldname: 'image',
  originalname: 'images (2).jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg',
  destination: 'uploads/top-level',
  filename: 'images (2)-1583345397445.jpg',
  path: 'uploads\\top-level\\images (2)-1583345397445.jpg',
  size: 33766 }

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

router.post('/user', userRoute);

и функция i userRoute Я написал что-то вроде этого, чтобы поймать ошибку

upload(req, res, function (err) {
    if (err instanceof multer.MulterError) {
       // catch error and show to user
    } else if (err) {
       // catch error and show to user here also
    }
    // Logic goes here

    // and we get the req.body here 
  })

этого достаточно для создания, где каждое поле является обязательным

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

  1. name
  2. location

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

вот код мультитера

var upload = multer({
  storage: multer.diskStorage({
      destination: (req, file, cb) => {
        cb(null, 'uploads/top-level')
      },
      filename: function (req, file, cb) {
        cb(null, file.originalname.split('.')[0] + '-' + Date.now() + path.extname(file.originalname))
      }
  }),
  fileFilter: (req, file, cb) => {
    if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || file.mimetype == "image/jpeg") {
      cb(null, true);
    } else {
      return cb(null, false);
    }
  }
});

1 Ответ

0 голосов

Прежде всего: У вас должна быть проверка на обоих интерфейсах и бэкэндах , чтобы обеспечить наилучший возможный опыт и избежать "глупых" ошибок, которые в конечном итоге могут (и будут) становиться fl aws просто ждет, чтобы быть использованным любым, кто его получит.

Второй: ВЫ НИКОГДА ПОКАЗЫВАЙТЕ ОШИБКИ КЛИЕНТАМ ( КОГДА-ЛИБО ) .. рассмотрите возможность использования промежуточного программного обеспечения connect-fla sh для отправки сообщения fla sh в уведомлениях или в любом месте вашего приложения ( проверьте документы для fla sh ()).

На внешнем интерфейсе вы должны блокировать загрузку типов файлов по расширениям, что довольно просто либо для нативных html, либо через JS (вы не указали ваш интерфейс, поэтому я пропущу эту часть для ясности).

На сервере вы можете проверить «req.file.mimetype», чтобы увидеть, находится ли он в массиве расширений, разрешенных вашей загрузкой функциональность. как то так:

var authorizedMimeTypes=['jpg','jpeg',...];
    if(req.file.mimetype in authorizedMimeTypes){
    //your code goes here..
    }else{
    //your error code goes here..

    };
...