J'utilise multer et multer-s3 pour télécharger une image dans s3 bucket.

Je souhaite conserver l'image d'origine telle quelle, mais j'ai besoin d'une vignette supplémentaire. Ensuite, téléchargez les deux sur s3. J'ai trouvé que le redimensionnement d'image peut être fait en utilisant Sharp mais je ne sais pas comment effectuer cette tâche particulière.

Quelqu'un peut-il conseiller comment faire cela?

const aws = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');

aws.config.update({
    secretAccessKey: process.env.AWSSecretKey,
    accessKeyId: process.env.AWSAccessKeyId,
});

const s3 = new aws.S3();

const fileFilter = (req, file, cb) => {
    if (file.mimetype === "image/jpeg" || file.mimetype === "image/png") {
        cb(null, true);
    } else {
        cb(new Error("Invalid file type, only JPEG and PNG is allowed!"), false);
    }
};

const storage = multerS3({
    s3: s3,
    bucket: process.env.S3_Bucket_Name,
    acl: 'public-read',
    metadata: (req, file, cb) => {
        cb(null, {
            fieldName: file.fieldname
        });
    },
    key: (req, file, cb) => {
        cb(null, Date.now().toString())
    }

});

const upload = multer({
    fileFilter: fileFilter,
    storage: storage,
});

module.exports = upload;

Le routage se fait de la manière suivante

router.post('/post/add', checkAuth, upload.single("photo"), PostController.createPost);
0
Janaka 3 sept. 2020 à 15:44

2 réponses

Meilleure réponse

Après avoir enregistré votre image, vous pouvez la redimensionner facilement.

Il vous suffit de passer le chemin vers l'image.

Remarquez ici: vous pouvez obtenir la largeur et la hauteur de l'image et vérifier si l'image a besoin d'un redimensionnement.

const sharp = require("sharp");

async function resizeImage(req, res) {
   let { width, height } = await sharp("path/to/image").metadata();
   let resizedImage;
   // you can check here if the image is too big. I will resize it to an width of 400
   if(width > 400) {
      await sharp("path/to/image")
          .resize({ fit: sharp.fit.contain, width: 400 })
          .jpeg({ quality: 90 })
          .toFile("path/to/thumbnail/directory);
   }
}
1
Ifaruki 4 sept. 2020 à 06:29

Essayez ceci, usage of sharpe module. Modifiez le gestionnaire d'itinéraire en fonction de vos besoins

router.post(
  "/users/me/avatar",
  authMiddleware,
  upload.single("avatar"),
  async (req, res) => {
      const buffer = await sharpe(req.file.buffer)
        .png()
        .resize({
          width: 300,
          height: 300
        })
        .toBuffer();
      req.user.avatar = buffer;
      await req.user.save();
      res.send();
    },
0
Jatin Mehrotra 4 sept. 2020 à 06:09