AWS :: S3 :: S3Object.url_for - Как это сделать с новым AWS SDK Gem? - PullRequest
25 голосов
/ 04 февраля 2012

Я использовал это навсегда со скрепкой и aws-s3:

  def authenticated_url(style = nil, expires_in = 90.minutes)
      AWS::S3::S3Object.url_for(attachment.path(style || attachment.default_style), attachment.bucket_name, :expires_in => expires_in, :use_ssl => true)
  end

В новой скрепке используется драгоценный камень AWS-SDK, что приводит к ошибке:

undefined method `url_for' for AWS::S3:Class

Кто-нибудь знает, как заставить этот метод работать с новым гемом AWS-SDK?

Ответы [ 5 ]

30 голосов
/ 10 февраля 2012

Чтобы сгенерировать URL с помощью гема aws-sdk, вы должны использовать метод AWS :: S3Object # url_for .
Вы можете получить доступ к экземпляру S3Object из вложения скрепки, используя # s3_object. Приведенный ниже фрагмент должен решить вашу проблему.

def authenticated_url(style = nil, expires_in = 90.minutes)
  attachment.s3_object(style).url_for(:read, :secure => true, :expires => expires_in).to_s
end
12 голосов
/ 12 августа 2015

Недавно я обновился до новейшего гема для AWS SDK 2 для Ruby (aws-sdk-2.1.13), и получение предварительно подписанного URL-адреса изменилось в этой версии SDK.

presigner = Aws::S3::Presigner.new
presigner.presigned_url(:get_object, #method
                        bucket: 'bucket-name', #name of the bucket
                        key: "key-name", #key name
                        expires_in: 7.days.to_i #time should be in seconds
                        ).to_s

Вы можете найти больше информации здесь: http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Presigner.html

4 голосов
/ 07 февраля 2012

После просмотра документации url_for является методом экземпляра, а не методом класса.

Чтобы сгенерировать URL с помощью aws-sdk, вам нужно сделать следующее:

bucket = AWS::S3::Bucket.new(attachment.bucket_name)
s3object = AWS::S3::S3Object.new(bucket, attachment.path(style || attachment.default_style))
s3object.url_for(:read, :expires => expires_in)

Параметры немного отличаются от указанных вами.

Опции Hash (опции):

: истекает (Объект) - Устанавливает срок действия URL; по истечении этого времени S3 вернет ошибку, если используется URL. Это может быть целое число (для указания количества секунд после текущего времени), строка (которая анализируется как дата с использованием Time # parse), объект Time или DateTime. По умолчанию этот параметр равен одному часу после текущего времени.

: безопасный (строка) - Создавать ли безопасный (HTTPS) URL-адрес или простой URL-адрес HTTP.

: response_content_type (String) - Устанавливает заголовок Content-Type ответа при выполнении HTTP GET для возвращенного URL.

: response_content_language (String) - Устанавливает заголовок Content-Language ответа при выполнении HTTP GET для возвращенного URL.

: response_expires (String) - Устанавливает заголовок Expires ответа при выполнении HTTP GET для возвращенного URL.

: response_cache_control (String) - Устанавливает заголовок Cache-Control ответа при выполнении HTTP GET для возвращенного URL.

: response_content_disposition (String) - Устанавливает заголовок Content-Disposition ответа при выполнении HTTP GET для возвращенного URL.

: response_content_encoding (String) - Устанавливает заголовок Content-Encoding ответа при выполнении HTTP GET для возвращенного URL.

3 голосов
/ 13 февраля 2012

Недавно я также переключился с aws-s3 на aws-sdk.Я заменил все свои url_for следующим:

 def authenticated_url(style = nil, expires_in = 90.minutes)
   self.attachment.expiring_url(expires_in, (style || attachment.default_style))
 end

Вы можете посмотреть обсуждение в ветке вопросов скрепки здесь: https://github.com/thoughtbot/paperclip/issues/732

1 голос
/ 10 февраля 2012
...