【问题标题】:Checking for successful S3 copy operation?检查 S3 复制操作是否成功?
【发布时间】:2023-04-05 11:25:01
【问题描述】:

我正在尝试使用 Amazon S3 Java API 实现移动操作。

我遇到的问题是AmazonS3Client.copyObject 方法返回的CopyObjectResult 对象似乎没有明确指示操作是否成功。

鉴于在此操作之后我将删除一个文件,我想确保操作成功。

有什么建议吗?

【问题讨论】:

  • 你有理由相信方法可以失败而不抛出异常吗?

标签: java amazon-s3


【解决方案1】:

这就是我最终做的,

def s3 = createS3Client(credentials)
def originalMeta = s3.getObjectMetadata(originalBucketName, key)
s3.copyObject(originalBucketName, key, newBucketName, newKey)
def newMeta = s3.getObjectMetadata(newBucketName, newKey)

// check that md5 matches to confirm this operation was successful
return originalMeta.contentMD5 == newMeta.contentMD5

请注意,这是 Groovy 代码,但它与 Java 代码的工作方式极为相似。

我不喜欢进行两次额外的操作来检查元数据,所以如果有更有效的方法,请告诉我。

【讨论】:

  • 这与我最近使用 PHP API 所做的非常相似。我会捕获原始 etag,复制,将原始 etag 与复制的 etag 进行比较,如果匹配,则删除原始。
  • 历史记录,跟进 Dan 的评论:当使用分段上传而不是常规上传时,生成 etags 的系统似乎发生了变化,因此通过 MD5 进行比较可能是更好的方法。
  • 由于S3没有即时一致性,所以这个方法不会偶尔显示对象没有被复制吗?
【解决方案2】:

我很确定您可以使用 CopyObjectResult 对象的 getETag method 来确认它在创建后具有有效的 ETag,就像在 CopyObjectRequest setETag 方法中所做的那样。

获取ETag

public String getETag() 获取新对象的 ETag 值 在关联的 CopyObjectRequest 中创建。返回:ETag 新对象的值。另见:setETag(String) setETag

public void setETag(String etag) 设置新的 ETag 值 从关联的复制对象请求创建的对象。 参数: etag - 新对象的 ETag 值。也可以看看: getETag()

始终相信数据。

几年前我使用 Amazon PhP SDK 执行类似功能已有一年了,但它应该可以工作。

【讨论】:

  • 这可能只是我对 S3 不熟悉,但我会在 etag 字符串上明确检查什么?
  • 如果您在发出 CopyObjectRequest 时设置它,您应该能够比较两者是否相等。希望对您有所帮助。
  • 最终,如果您不确定,只需测试一下即可。使用您不关心的文件。
  • 我觉得我错过了一些更大的上下文,什么是 ETag?
  • 他们在这个线程中解释得很好:stackoverflow.com/questions/6591047/…
【解决方案3】:

AWS 文档说

成功复制的源 ETag 和目标 ETag 相同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多