问题描述
我正在使用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的写入后读取一致性中受益。