Как загрузить пустую папку на s3, используя рельсы - PullRequest
0 голосов
/ 08 марта 2019

Я создаю объект для пустой папки, но не могу поместить его на S3.Я использую гем 'aws-sdk', '<2.0' </p>

. Я пытался использовать метод "put", а также пытался использовать метод "put_object", но я не могу заставить его работать.Кто-нибудь может мне помочь?

Код, который я использую с put_object:

 key = 'folder'+'/'+subfolder+'/'    
    folder_key = S3_BUCKET.objects[key]
    folder_key.put_object

И получаю ошибку:

error : undefined method `put_object' for <AWS::S3::S3Object:bucketname/folder/subfolder/>:AWS::S3::S3Object

При использовании 'put'method:

    folder_key.put()

Я получаю ошибку:

error : undefined method `put' for <AWS::S3::S3Object:bucketname/folder/subfolder/>:AWS::S3::S3Object

Где S3_BUCKET определяет учетные данные для S3.

Здесь ключ папки создает объект для папки, но каксохранить его на s3

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

В S3 нет такого понятия, как «папка». Я думаю, что вы имеете в виду префикс ключа, который выглядит как путь к папке перед именем файла, но не является им.

S3 - это просто хранилище значений ключей. Ключ представляет собой уникальную строку , а значение представляет собой BLOB-объект .

Чтобы определить ключ, люди часто используют путь, подобный ключу, и консоль S3 поддерживает этот формат для детализации структуры стилей папок, упрощая поиск объектов вручную. Это всего лишь текстовый фильтр для ключа, такой как фильтр StartWith ().

Если у вас нет объекта с определенным префиксом ключа, то так называемый путь не существует.

Не на 100% ясно, что вы пытаетесь достичь, но вкратце:

Вам не нужно создавать папку перед загрузкой файла с новым префиксом. Просто загрузите объект с нужным ключом.

См. Ответ Стюарта о том, как этого добиться в рельсах.

0 голосов
/ 08 марта 2019

Я расскажу вам немного о создании объектов в S3, поскольку я не совсем уверен, о чем вы спрашиваете, поэтому, возможно, общий обзор поможет.

put_object и *Методы 1004 * определены в классе S3 :: Client, а не в сегменте объектов.Вот почему вы получаете сообщение об ошибке - они не являются методами класса S3Object.

Имея это в виду, вам сначала нужно создать экземпляр клиента S3:

profile_name = 'Rinkal'
region = 'us-east-1'
s3 = Aws::S3::Client.new(profile: profile_name, region: region)

Вытеперь может взаимодействовать с S3 через только что созданного клиента.Это, конечно, при условии, что вы правильно настроили аутентификацию S3 - подробнее об этом здесь.

Предполагая, что у вас есть имя корзины (похоже, в вашем коде это folder_key), вы можете создать объект внутри этого сегмента:

s3.put_object(bucket: folder_key, key: "file", body: "Rinkal's s3 object")

Если вы хотите создать блок, а не объект, вы можете сделать это с помощью следующего кода:

s3.create_bucket(bucket: 'my-bucket')

Надеюсь, что поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...