2017-01-06 2 views
2

Мое приложение хранит файлы на AWS S3. Когда файлы извлекаются, некоторые из них не имеют поля метаданных. Я хотел бы написать службу, которая позволяет мне проверять файлы, чтобы увидеть, присутствует ли поле метаданных и действительно ли они после их получения с S3. Я чувствую, что это должно быть так просто, как my_object.show_metadata, но у меня проблемы с поиском решения. Существует метод AWS::S3::Object#metadata, но когда я пытаюсь использовать его я получаю следующее сообщение об ошибке:Как программно читать метаданные с объекта AWS S3 в Rails?

*** NoMethodError Exception: undefined method `set?' for # < Hash::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

Это хорошая идея для вас, чтобы добавить свое редактирование в качестве ответа и принять его. Таким образом, люди могут видеть, что этот вопрос имеет ответ в результатах поиска. –

+1

@TomManterfield Спасибо, все еще изучая веревки! – sammms

ответ

1

Правильный способ выполнения того, что задает этот вопрос, на самом деле является методом метаданных AWS :: S3 :: Object #. В этом случае проблема заключается в том, что разрешения должны быть явно заданы при создании объекта 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.

Смежные вопросы