Получите размеры изображения с Multer

Есть ли способ получить размеры изображения перед тем, как загрузить его с помощью Multer на Node.Js?

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

Вот серверное приложение Node.Js

app.post("/upload", function (req, res, fields) {

    const storage = multer.diskStorage({
      destination: "public/data/",
      filename: function (req, file, cb) {
        crypto.randomBytes(30, (err, buf) => {
          cb(null, buf.toString("hex") + path.extname(file.originalname))
        })
      }
    });

    const upload = multer({
      storage: storage
    }).fields([{
      name: "pp"
    }, {
      name: "banner"
    }]);

    upload(req, res, (err) => {
      if (err) throw err;
      if (req.files.pp) {
        var PPsrc = req.files.pp[0].path.slice(7);
        var hasPP = 1;
      } else {
        var PPsrc = null;
        var hasPP = 0;
      }
      if (req.files.banner) {
        var Bannersrc = req.files.banner[0].path.slice(7);
        var hasBanner = 1;
      } else {
        var Bannersrc = null;
        var hasBanner = 0;
      }

      con.query("SQL Request", [hasPP, PPsrc, hasBanner, Bannersrc, sess.email], function (err) {
        if (err) throw err;
        console.log("Profile Picture and banner updated for user: " + sess.email);
        res.redirect("/profile");
      });
    }); 
  })

И моя форма:

<form action="/upload" enctype="multipart/form-data" method="post">
          <label for="pp_uploader">Add a profile picture</label>
          <input type="file" id="pp_uploader" name="pp" accept="image/jpeg, image/jpg"/><br>
          <label for="banner_uploader">Add a Banner</label>
          <input type="file" id="banner_uploader" name="banner" /><br>
          <input class="sbutton" type="submit" value="Envoyer" />
        </form>

Есть ли способ сделать это с пакетом npm?

1 ответ

Решение

Я наконец помещаю свои фотографии в папку tmp прежде, чем получить их размеры.

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

npm install image-size --save

Синхронный код:

var sizeOf = require('image-size');
var dimensions = sizeOf('someimage.png'); // replace with your image
console.log(dimensions.width, dimensions.height);

Асинхронный код:

var { promisify } = require('util');
var sizeOf = promisify(require('image-size'));
sizeOf('someimage.png')
  .then(dimensions => { console.log(dimensions.width, dimensions.height); })
  .catch(err => console.error(err));

вы можете использовать любой подход, упомянутый выше

теперь сначала сохраните входящее изображение в вашем репозитории, которое поступает из multer, а затем, если ваши требуемые размеры будут нарушены, как вы упомянули (sizes.width < 300 && sizes.height < 300), их после удаления сохраненного изображения из репозитория, но если размеры соответствуют до вашего размера, то пусть картинка будет в репо.

код для удаления изображения из репозитория

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

const clearImage = filePath => {
  filePath = path.join(__dirname, "../images/", filePath);
  fs.unlink(filePath, err => {
    console.log(err);
  });
};

Примечание. Вторым параметром метода path.join будет ваш путь, по которому хранится ваше изображение.

Надеюсь, это кому-то поможет!

Другие вопросы по тегам