使用Node.js将映像更新到AWS S3

问题描述

我正在使用node通过aws-sdk和multer midlleware将图像保存到aws s3存储中。

我有一张用户照片,并且正在使用固定名称作为aws S3中对象的键。

用户更改照片时,我使用相同的键再次将其保存到aws s3中。

我的问题是AWS中的照片从未更新。

在更新对象之前,我也尝试删除该对象,但是没有外观。

如果我为照片添加一个唯一的键,那么一切正常。

是否可以更新照片并继续使用相同的键?

const storageS3 = multerS3({
  s3: s3,//new aws.S3(),bucket: process.env.BUCKET_NAME,contentType: multerS3.AUTO_CONTENT_TYPE,acl: "public-read",key: async (req,file,cb) => {
    const fileName = `${req.data.account_id}/empresas/empresa-${req.params.id}/profile/profile` +
      path.extname(file.originalname);
    cb(null,fileName);
  }
});

const uploadProfileS3 = multer({
  storage: storageS3,limits: { fileSize: MAX_SIZE },fileFilter: function(req,cb) {
    checkFileType(file,cb);
  },}).single("file");

解决方法

两件事可能导致此。首先,S3最终是一致的(https://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel),因此,如果更新对象,则后续的GET可能会得到旧的对象。我找不到任何保证这种“最终”一致性可能需要花费多少时间的方法,但是我可以想象,如果用户上传新的头像,它不会在几秒钟内更新。

第二个是浏览器缓存。如果原始图像仍在缓存中,则对相同URL的请求甚至不会到达S3,而是使用了本地缓存。

如果要存储用户头像图像,建议您将当前图像的名称存储在数据库中,并为每次上传使用完全随机的名称。这样,您可以解决所有缓存问题,还可以从S3的写入后读取一致性中受益。