【问题标题】:Set Expires header for an existing S3 object using AWS Java SDK使用 AWS Java 开发工具包为现有 S3 对象设置 Expires 标头
【发布时间】:2023-03-20 18:24:01
【问题描述】:

我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据。我想为每个对象设置 HTTP Expires 标头以更好地处理 HTTP/1.0 客户端。

我们使用AWS Java SDK,它允许在不重新上传对象内容的情况下更改对象的元数据。我们使用CopyObjectRequest 将对象复制到自身。 ObjectMetadata 类允许我们设置Cache-ControlContent-Type 和其他几个标题。但不是Expires 标头。

我知道 S3 使用 REST API 存储和提供对象 PUT 的 Expires 标头。有没有办法通过 Java SDK 做到这一点?

更新表明我们正在使用 CopyObjectRequest

【问题讨论】:

    标签: java amazon-s3 http-headers amazon-web-services


    【解决方案1】:

    要更改现有Amazon S3 对象的metadata,您需要将对象复制到自身并即时提供所需的新元数据,请参阅copyObject()

    默认情况下,源对象的所有对象元数据都复制到 新的目标对象,除非在 提供了指定的 CopyObjectRequest。

    这可以大致实现(我头顶的片段,所以要小心):

    AmazonS3 s3 = new AmazonS3Client();
    
    String bucketName = "bucketName ";
    String key = "key.txt";
    ObjectMetadata newObjectMetadata = new ObjectMetadata();
    // ... whatever you desire, e.g.:
    newObjectMetadata.setHeader("Expires", "Thu, 21 Mar 2042 08:16:32 GMT");
    
    CopyObjectRequest copyObjectRequest = new CopyObjectRequest()
                     .WithSourceBucketName(bucketName)
                     .WithSourceKey(key)
                     .WithDestinationBucket(bucketName)
                     .WithDestinationKey(key)
                     .withNewObjectMetadata(newObjectMetadata);
    
    s3.copyObject(copyObjectRequest);
    

    请注意以下容易错过但很重要的copyObject()约束:

    Amazon S3 访问控制列表 (ACL) 复制到新的 目的。新对象将具有默认的 Amazon S3 ACL, CannedAccessControlList.Private,除非在 指定的 CopyObjectRequest。

    这在我的代码片段中还没有考虑!

    祝你好运!

    【讨论】:

    • 我应该更好地解释我们现在使用CopyObjectRequest 来执行此操作。我已更新问题以反映这一点。
    • ObjectMetadata.setHeader 被标记为仅供内部使用。你成功使用过这个吗?我们的代码只会运行一次,因此如果亚马逊进行更改,我们以后无需担心它。但是YMMV。
    • 嗯,我确实不知道这个限制,但回想一下前一段时间使用过Expires:;不过我可能是错的,因为我经常使用其他 SDK 与 S3 交互(例如 C#/Python,它们确实支持这一点)并且可能把它混在一起 - 代码本身与其他 setXYZHeader() 方法没有区别目前(请参阅ObjectMetadata.java),因此限制将基于不可见的副作用,如果有的话。
    • 它可能被其他标头方法在内部和内部使用,因为只有某些标头才能工作。他们应该在ObjectMetadata 上添加一个setExpires 方法,因为它是唯一没有自己方法的标头。
    • @SteffenOpel Expires 值的“正确”日期是什么? 2042 年或 2014 年或 2024 年?从这个日期起取决于什么?这是将日期设置为 2042 年(或任何更远的日期)的理由吗?
    【解决方案2】:

    我们一直在寻找类似的解决方案,最终选择了 max-age cache-control 指令。我们最终意识到 hte cache-control 会覆盖 Expires,即使 expires 更具限制性。无论如何,缓存控制也满足了我们的要求。

    【讨论】:

    • 谢谢。您是绝对正确的 Cache-Control 取代了 Expires 标头。尽管如此,我们还是希望将它包含在不尊重Cache-Control 的 HTTP/1.0 客户端中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    相关资源
    最近更新 更多