проверка размера файла перед загрузкой изображения с помощью multer

#javascript #node.js #file #multer

#javascript #node.js #файл #multer

Вопрос:

как я могу использовать отправленные данные, связанные с передачей изображения на сервер, используя multer, перед загрузкой на диск.Возможно ли это? если нет, то, пожалуйста, дайте мне другое решение.
Я хочу проверить размер файла, его разрешение должно быть не менее 4 Мп, если оно меньше, чем изображения, которые не должны быть загружены, и отправить сообщение об ошибке

 exports.uploadimg=(req,res,next)=>{
  
    uploadphoto(req, res, (err) => {
        if (err) {
            res.render("upload")
        }
        else {


    
            

          


           
            res.send("photo uloaded")
        }
    })
 

Ответ №1:

Я так понимаю, у вас есть какое-то составное промежуточное программное обеспечение (скажем, connect-multiparty), считывающее полезную нагрузку запроса для multipart/form-data запросов.

Это промежуточное программное обеспечение предоставило бы вам files объект в request object ( request.files ). Свойства files объекта являются ключами для каждого поля загрузки файла. Значением для каждого такого свойства может быть объект (загрузка одного файла) или массив (загрузка нескольких файлов). Каждый из этих объектов, вложенных в files объект, имеет свойства, описывающие фактический загруженный файл, и позволяет запускать проверки по своему усмотрению в следующем промежуточном программном обеспечении.

 // router declarations
const {Router} = require('express');
const multipart = require('connect-multipart');

const multipartMiddleware = multipart();

const validateFileSize = (file) => {
  /*
      Each file has the following property:

        fieldName - same as name - the field name for this file
        originalFilename - the filename that the user reports for the file
        path - the absolute path of the uploaded file on disk
        headers - the HTTP headers that were sent along with this file
        size - size of the file in bytes
    */
    // check against file size
    if (file.size < 4 * 1024 * 1024) throw new Error('File is too small');
}

const validateImageMiddleware = (req, res, next) => {
  // say we expected an upload field with key "productImage"
  const { files: { productImage } } = req;
  const isMultiple = Array.isArray(productImage);
  if (isMultiple) {
    productImage.forEach(validateFileSize);
  } else {
    validateFileSize(productImage);
  }
  // if we got here, the files were valid so we go to next handler
  next();
};

const myRouter = Router();
myRouter.post('/expect-file', multipartMiddleware, validateImageMiddleware, (req, res) => {
  // do whatever you want to do
  res.send('Success');
}); 

Комментарии:

1. я использую multer для загрузки изображений. но он не предоставляет никакого размера изображения до его получения. однако, если мы используем объект req вне вызова multer, т.е. Перед новым uplaoding-файлом, его show req.body будет пустым, а если мы используем внутри вызова multer, т.е. после сохранения изображений или загрузки req.body, в нем будут необходимые данные.

2. поскольку я использую multipart / form-data, это может произойти из-за этого. знаете ли вы какой-нибудь другой способ, который я могу решить вышеописанную проблему, также у меня были категории прохождения, и перед его загрузкой я должен проверить изображение, к каким категориям оно принадлежит, и, соответственно, я должен сохранить его в соответствующую папку с изображениями, я застрял здесь, помогите мне в этом.

3. Вы пробовали передавать validateFileSize функцию (как указано выше или реализованную по вашему усмотрению) в качестве следующего промежуточного программного обеспечения после размещения промежуточного программного обеспечения multer в спецификации маршрутизатора?

4. Проверьте req.file (если одно изображение) или req.files (для нескольких)