AWS :: S3 :: S3Object.url_for – ¿Cómo hacer esto con el nuevo AWS SDK Gem?

He estado usando esto desde siempre con paperclip y 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 

El nuevo clip utiliza la gem AWS-SDK, que rompe esto dando el error:

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

¿Alguien sabe cómo hacer que este método funcione con la nueva gem AWS-SDK?

Para generar una url usando la gem aws-sdk, debe usar el método AWS :: S3Object # url_for .
Puede acceder a la instancia de S3Object desde un archivo adjunto con clip utilizando # s3_object. El fragmento de código a continuación debe resolver su problema.

 def authenticated_url(style = nil, expires_in = 90.minutes) attachment.s3_object(style).url_for(:read, :secure => true, :expires => expires_in).to_s end 

Recientemente, actualicé a la nueva gem para AWS SDK 2 para Ruby (aws-sdk-2.1.13) y el cambio de la URL previamente firmada ha cambiado en esta versión del SDK.

La forma de conseguirlo:

 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 

Puede encontrar más información aquí: http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Presigner.html

Después de buscar en la documentación , url_for es un método de instancia y no un método de clase.

Para generar una URL con aws-sdk, necesita hacer lo siguiente:

 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) 

Las opciones son ligeramente diferentes a las que especificó.

Opciones Hash (opciones):

: expira (objeto): establece el tiempo de caducidad de la URL; después de este tiempo, S3 devolverá un error si se usa la URL. Puede ser un número entero (para especificar el número de segundos después de la hora actual), una cadena (que se analiza como una fecha usando Time # parse), un objeto Time o DateTime. La opción predeterminada es una hora después de la hora actual.

: seguro (String): si se genera una URL segura (HTTPS) o una url HTTP simple.

: response_content_type (String): establece el encabezado Content-Type de la respuesta cuando se realiza un GET de HTTP en la URL devuelta.

: response_content_language (String): establece el encabezado Content-Language de la respuesta cuando se realiza un HTTP GET en la URL devuelta.

: response_expires (String): establece el encabezado Expires de la respuesta cuando se realiza un GET de HTTP en la URL devuelta.

: response_cache_control (String): establece el encabezado Cache-Control de la respuesta cuando se realiza un GET de HTTP en la URL devuelta.

: response_content_disposition (String): establece el encabezado Content-Disposition de la respuesta al realizar un GET de HTTP en la URL devuelta.

: response_content_encoding (String): establece el encabezado de encoding de contenido de la respuesta cuando se realiza un GET de HTTP en la URL devuelta.

Recientemente también hice el cambio de aws-s3 a aws-sdk. Reemplacé todos mis url_for con lo siguiente:

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

Puede ver la discusión en el hilo de problemas de clip aquí: https://github.com/thoughtbot/paperclip/issues/732