Express — как мне использовать sharp с multer?

#multer #sharp

#multer #sharp

Вопрос:

Мне нужна помощь в использовании sharp, я хочу, чтобы мои изображения изменяли размер при загрузке, но, похоже, я не могу сделать это правильно.

 router.post("/", upload.single("image"), async (req, res) => {
    const { filename: image } = req.file;

    await sharp(req.file.path)
        .resize(300, 200)
        .jpeg({ quality: 50 })
        .toFile(path.resolve(req.file.destination, "resized", image));

    fs.unlinkSync(req.file.path);
    res.send("sent");
});
  

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

1. эта ссылка содержит и реализацию sharp и multer для загрузки файлов, проверьте это

Ответ №1:

Насколько я знаю, вы должны передавать a Buffer в sharp, а не путь. Вместо изменения размера сохраненного изображения измените его размер перед сохранением. чтобы реализовать это, вы должны использовать multer.memoryStorage() as storage.

 const multer = require('multer');
const sharp = require('sharp');

const storage = multer.memoryStorage();

const filter = (req, file, cb) => {
    if (file.mimetype.split("/")[0] === 'image') {
        cb(null, true);
    } else {
        cb(new Error("Only images are allowed!"));
    }
};

exports.imageUploader = multer({
    storage,
    fileFilter: filter
});

app.post('/', imageUploader.single('photo'), async (req, res, next) => {
    // req.file includes the buffer
    // path: where to store resized photo
    const path = `./public/img/${req.file.filename}`;

    // toFile() method stores the image on disk
    await sharp(req.file.buffer).resize(300, 300).toFile(path);
    next();
});