代码之家  ›  专栏  ›  技术社区  ›  Roger Lipscombe

Amazon S3:在上传完成之前,客户端可以看到文件吗

  •  15
  • Roger Lipscombe  · 技术社区  · 8 年前

    PutObject - Amazon Simple Storage Service ,我发现以下内容:

    Amazon S3从不添加部分对象;如果收到成功响应,AmazonS3会将整个对象添加到bucket中。

    但那是说 收到成功响应。我能保证不 另外 客户端在列出bucket中的对象时会看到这个对象——直到整个对象被上传?

    我想使用S3作为“spool”目录——我将在那里上传文件,另一个客户机将定期列出这些文件,然后下载它们。我不希望它试图下载一个没有完全上传的文件。

    1 回复  |  直到 2 年前
        1
  •  24
  •   Michael - sqlbot    8 年前

    答案与此一致:

    Amazon S3从不添加部分对象

    在上传完成之前,正在上传的内容在技术上并不“在”bucket中。

    正如您可能知道的那样,S3不是分层文件系统。它至少有两个重要的组件,后备存储和索引,与典型的文件系统不同,它们是分开的……因此,当你写一个对象时,你并不是真的在“原地”写它。上传一个对象会将对象保存到后备存储,并且 然后 将其添加到bucket的索引中,该索引由 GET 以及其他获取存储数据和元数据以进行检索的请求。

    如果索引中没有条目,则无法访问该对象。所以你很好。下载尚未完成上载的对象是不可能的。从技术上讲,这个对象还不存在。

    类似地,如果一个对象已经存在,并且您开始覆盖它,那么任何试图下载它的人都会获得该对象的“旧”副本,至少直到您的上传完成为止,即使在没有启用版本控制的bucket中也是如此——覆盖不会覆盖实际的对象,它会覆盖索引项,只有在上传完成时才会发生这种情况。请注意,此机制似乎负责应用于的最终一致性模型 PUT 覆盖现有对象的请求。


    注意,关于数据完整性:确保无论您使用什么上传设置 Content-MD 请求标头。这为S3提供了一种检测传输错误的机制,并在上传的内容不匹配时强制失败,从而防止了损坏的上传。