如何以编程方式从Rails中的AWS S3对象读取元数据?

时间:2017-01-06 19:48:46

标签: ruby-on-rails amazon-web-services amazon-s3 metadata

我的应用程序正在AWS S3上存储文件。检索文件时,其中一些文件缺少元数据字段。我想编写一个服务,让我检查文件,看看元数据字段是否存在并且在从S3检索后是否有效。我觉得它应该像my_object.show_metadata一样简单,但我无法追踪解决方案。有一个AWS::S3::Object#metadata方法,但是当我尝试使用它时,我收到以下错误:

  

*** NoMethodError异常:未定义的方法`set?'对于#<散列:: 0x007ffa547a9350>

有任何见解或问题可以帮助我找到我的盲点。

更新:此问题已得到解决。执行此问题的正确方法实际上是AWS::S3::Object#metadata方法。在这种情况下的问题是必须在创建S3对象时显式设置权限。在修复之前:

Aws::S3::Object.new(
  region: 'us-east-1',
  access_key_id: ENV['AWS_ACCESS_KEY_ID'],
  secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],
  bucket_name: "foo",
  key: key
)

修复后:

Aws.config.update({
  credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
})

Aws::S3::Object.new(
  region: 'us-east-1',
  bucket_name: "foo",
  key: key
)

调整代码后,我能够成功使用所有AWS S3方法,包括#metadata

1 个答案:

答案 0 :(得分:1)

执行此问题的正确方法实际上是AWS :: S3 :: Object#metadata方法。在这种情况下的问题是必须在创建S3对象时显式设置权限。在修复之前:

Aws::S3::Object.new(   
    region: 'us-east-1',   
    access_key_id: ENV['AWS_ACCESS_KEY_ID'],   
    secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'],   
    bucket_name: "foo",   
    key: key 
)

修复后:

Aws.config.update({   
    credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], 
    ENV['AWS_SECRET_ACCESS_KEY']) 
}) 

Aws::S3::Object.new(   
    region: 'us-east-1',   
    bucket_name: "foo",  
    key: key 
)

调整我的代码后,我能够成功使用所有AWS S3方法,包括#metadata。

相关问题