web-dev-qa-db-ja.com

AWS :: S3 :: S3Object.url_for-新しいAWSSDK Gemでこれを行う方法は?

私はこれをPaperclipと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-SDKgemを使用しているため、これが壊れてエラーが発生します。

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

このメソッドを新しいAWS-SDKgemで機能させる方法を知っている人はいますか?

27
AnApprentice

最近、AWS SDK 2 for Ruby(aws-sdk-2.1.13)の最新のgemにアップグレードし、このSDKバージョンで事前署名されたURLの取得が変更されました。

それを取得する方法:

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

13
Viktor Nonov

documentation を調べた後、url_forはインスタンスメソッドであり、クラスメソッドではありません。

Aws-sdkを使用してURLを生成するには、次の手順を実行する必要があります。

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)

オプションは、指定したものとは少し異なります。

オプションハッシュ(オプション):

:expires(Object)—URLの有効期限を設定します。この時間以降、URLが使用されている場合、S3はエラーを返します。これは、整数(現在の時刻からの秒数を指定するため)、文字列(Time#parseを使用して日付として解析される)、Time、またはDateTimeオブジェクトにすることができます。このオプションのデフォルトは、現在の時刻の1時間後です。

:secure(String)—セキュア(HTTPS)URLを生成するかプレーンHTTPURLを生成するか。

:response_content_type(String)—返されたURLでHTTPGETを実行するときの応答のContent-Typeヘッダーを設定します。

:response_content_language(String)—返されたURLでHTTPGETを実行するときの応答のContent-Languageヘッダーを設定します。

:response_expires(String)—返されたURLでHTTPGETを実行するときの応答のExpiresヘッダーを設定します。

:response_cache_control(String)—返されたURLでHTTPGETを実行するときの応答のCache-Controlヘッダーを設定します。

:response_content_disposition(String)—返されたURLでHTTPGETを実行するときの応答のContent-Dispositionヘッダーを設定します。

:response_content_encoding(String)—返されたURLでHTTPGETを実行するときの応答のContent-Encodingヘッダーを設定します。

4
Gazler

最近、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

3
John
1
maletor