等待Sharp调整大小,然后再上传到S3

时间:2019-09-23 19:52:46

标签: node.js express amazon-s3 multer sharp

我正在使用MulterS3将文件上传到Amazon S3,并利用Sharp预先调整图像大小。 下面的代码在大多数时间有效,但并非总是如此。

我的意思是,有时在将图像上载水印之前将其调整为指定的大小,然后再将其上载到S3,但这有时不会发生。 有时,图像只是上载到S3而没有调整大小或应用水印。

我怀疑这背后的原因不是在实际上传到S3之前等待Sharp完成对图像的处理。

请记住,我的猜测可能是完全错误的,并且该问题可能隐藏在代码的其他位置。

您看到的代码直接在multer-s3-transform项目中使用。 链接:https://www.npmjs.com/package/multer-s3-transform

我描述的问题与第二个“转换”函数有关,该函数包括sharp()。resize(300,null)。

感谢您的帮助!

我尝试使用异步等待,但这无济于事,因为它在回调内部无效。

const mediaUpload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'test-bucket',
    limits: { fileSize: 5 * 1024 * 1024 },
    acl: 'public-read',
    shouldTransform: function(req, file, cb) {
      cb(null, true);
    },
    transforms: [
      {
        id: 'original',
        key: function(req, file, cb) {
          const fileName =
            req.user._id +
            Date.now().toString() +
            path.extname(file.originalname);
          const folderName = 'originals/';
          const filePath = folderName + fileName;
          cb(null, filePath);
        },
        transform: function(req, file, cb) {
          cb(null, sharp());
        }
      },
      {
        id: 'cover',
        key: function(req, file, cb) {
          const fileName =
            req.user._id +
            Date.now().toString() +
            path.extname(file.originalname);
          const folderName = 'thumbnails/';
          const filePath = folderName + fileName;
          cb(null, filePath);
        },
        transform: function(req, file, cb) {
          cb(
            null,
            sharp()
              .resize(300, null)
              .composite([{ input: watermark }])
              .sharpen()
          );
        }
      }
    ]
  })
});

0 个答案:

没有答案