【问题标题】:Add Metadata on Amazon S3 object is not persistent在 Amazon S3 对象上添加元数据不是持久的
【发布时间】:2016-05-27 06:25:53
【问题描述】:

我正在尝试向 S3 对象添加新的元数据信息,以便知道我已经处理的所有对象是什么。但是由于某种原因,我添加的新数据不是持久的。当我退出程序时,它不再存在。我没有在旧数据中看到“已处理”的新字段,但我看到它存在于新数据中。我希望新添加的元数据字段永久显示在对象上,但退出程序后它就消失了

        ObjectMetadata objMetaData = new ObjectMetadata();
        objMetaData = s3.getObjectMetadata(bucketName,prefix);
        Map<String, String> map = new HashMap<String, String>();
        Map<String, String> newMap = new HashMap<String, String>();
        map = objMetaData.getUserMetadata();
        System.out.println("old Meta data is " + map.toString());
        objMetaData.addUserMetadata("x-amz-meta-processed", "true");
        newMap = objMetaData.getUserMetadata();
        System.out.println("New processed data  is" +newMap.toString());

【问题讨论】:

  • 您似乎只在本地更改元数据,那为什么会令人惊讶呢?
  • 所以我是否必须再次执行 putObject 才能使这个新的元数据发生?我认为 addUserMetadata 应该自动添加新数据,而不必为了添加一些用户元数据而再次放置整个对象。请澄清我是否弄错了。
  • 那么有s3.setObjectMetadata吗?
  • 是的,但它会将整个元数据重置为我添加的新字段。然后我丢失了对象上已经存在的所有现有元数据项。
  • 所以用整个更新的元数据调用它,或者看看是否有一个更新而不是替换的方法。你是希望我进来帮你打字还是什么? 努力

标签: amazon-s3 metadata amazon


【解决方案1】:

我怀疑你的困惑来自于不了解 S3 设计的一个重要部分:

  • S3 对象不能修改,它们的元数据也不能。这一切都是不可变的。

等等,什么?这在技术上是正确的。

修改对象元数据的唯一方法是复制对象并设置元数据。

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html

实际上,您可以将元数据“添加”到对象中,但真正的意思是您要求 S3 制作对象的副本,使用相同的键源和目标,但使用“不同”的元数据。

如果您希望对象上的“不同”元数据包含已经存在的元数据,则您必须将其包含在请求中。

S3 支持将对象复制到自身上,因此您实际上不必重新上传对象。

您现在所做的只是更改本地代码数据结构中的值。

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 2011-06-12
    • 2021-09-16
    • 2021-09-26
    • 2018-08-09
    • 2022-08-19
    相关资源
    最近更新 更多