用户连续点两次保存,两次上传用了相同的 key,后一次把前一次覆盖。第一份文件无法找回,桶没有开版本控制,也没有任何报错。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,对象存储是最后写入生效,同名 PUT 不报错也不提示。没开版本控制时旧对象直接被替换,连删除标记都没有。前端按钮没做防抖,两次请求间隔不到 200ms。

「同名覆盖」这类改动最怕改一半,回滚脚本先准备好,再动生产。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

aws s3api put-object --bucket b --key a.jpg --body a.jpg
aws s3api head-object --bucket b --key a.jpg
aws s3api list-object-versions --bucket b --prefix a.jpg

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

具体做法是,key 里加内容哈希或随机后缀 从源头避免同名;需要保留历史就开版本控制 并配非当前版本过期规则;前端按钮加禁用和幂等键;确认覆盖行为前 先用 head-object 看修改时间。

最后用这个标准收尾,两次上传生成两个不同 key,head-object 的 LastModified 不再互相覆盖。

作者 9823189