Получите размеры изображения с 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 будет ваш путь, по которому хранится ваше изображение.
Надеюсь, это кому-то поможет!