如何将同名文件上传到Amazon S3并覆盖现有文件?

32
s3.putObject({
        Bucket: bucketName,
        Key: fileName,
        Body: file,
        ACL: 'bucket-owner-full-control'
    }, function(err, data) {
        if (err) {
            console.log(err);
        }
        console.log(data)
    }
);

我使用这段代码将图片上传到我的亚马逊S3云存储。但是,如果文件名与服务器上已有的重复,我就无法上传。

有什么方法可以上传同名文件并覆盖S3中已有的文件吗?

谢谢任何帮助 :)


这个存储桶是否启用了版本控制或其他策略,以便默认情况下可以更新文件? - Vsevolod Goloviznin
请帮助我们更好地了解您的问题。正如@VsevolodGoloviznin所说,使用相同路径和名称上传文件(S3将其称为对象键)应该自动替换旧文件为新文件。如果存储桶启用了版本控制,旧文件将不会被实际删除,而是被隐藏起来。 - Michael - sqlbot
2个回答

61

默认情况下,当您上传具有相同名称的文件时,它将覆盖现有文件。如果您希望保留以前的文件,您需要在存储桶中启用版本控制。


1
如果有人需要参考,“Amazon S3是一个分布式系统。如果同时接收到多个针对同一对象的写入请求,则仅保留最后写入的对象”。 https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html - user19906
1
请注意,如果您在S3 UI中单击“上传”,拖放文件,然后仅单击“上传”,则可能会更改文件的权限。例如,我们失去了“公共”读取访问权限,因此我们不得不重复这些步骤并添加该权限。 - Mike Dubs

17

我猜你遇到了默认的缓存机制,它是24小时,这会导致你无法接收到最新的存储对象。为了覆盖它,需要在putObject()中添加参数:

CacheControl: "no-cache" 或者 Expires: new Date()


我在上传到相同的S3路径时遇到了类似的问题。通过设置CacheControl(Y)解决了该问题。 - codename_47
对于健忘的人来说,这是一个很好的提醒 :) - Lior Kupers
好的,回答不错,但最好还是添加一个简单的示例来调用所提到的方法,并使用新的参数,这样会更容易理解。 - Mahmoud Magdy
设置CacheControl缓存控制对我没有起作用,但设置Expires却奏效了。谢谢! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接