2012-07-17 10 views
13

Me gustaría subir imágenes de las URL por clip en el almacenamiento S3. trabajo con:Paperclip: carga desde la url con la extensión

Ruby 1.9.3 
Rails 3.2.6 
paperclip 3.1.3 
aws-sdk 1.3.9 

tengo mi modelo de la foto:

class Asset 

    has_attached_file :asset, 
    :styles => {:thumb => "60x60>"}, 
    :storage => :s3, 
    :s3_credentials => "#{Rails.root}/config/s3.yml", 
    :path => "/pictures/:id/:style.:extension" 

    validates_attachment_content_type :asset, :content_type => ['image/gif', 'image/jpeg', 'image/png', 'image/x-ms-bmp'] 

end 

Así que, básicamente Hice esto para descargar mi archivo desde una URL:

picture = Asset.new(asset: open("http://www.my_url.com/my_picture.jpg")) 
picture.save 

Pero guardo mi archivo con un bad file_name y no establece la extensión del archivo:

#<Asset id: 5, asset_file_name: "open-uri20120717-6028-1k3f7xz", asset_content_type: "image/jpeg", asset_update_at: nil, asset_file_size: 91565, created_at: "2012-07-17 12:41:40", updated_at: "2012-07-17 12:41:40"> 
p.asset.url 
    => http://s3.amazonaws.com/my_assets_path/pictures/5/original. 

Como puede ver, no hay extensión.

Encontré un método para resolverlo, pero estoy seguro de que puedo tener una mejor manera. Esta solución es copiar el archivo en mi equipo y luego se lo envío de S3 como esto:

filename = "#{Rails.root}/tmp/my_picture.jpg" 
open(filename, 'wb') do |file| 
    file << open("http://www.my_url.com/my_picture.jpg").read 
end 

picture = Asset::Picture.new(asset: open(filename)) 
picture.save 

Esto funciona en mi equipo:

#<Asset::Picture id: 10, asset_file_name: "my_picture.jpg", asset_content_type: "image/jpeg", asset_update_at: nil, asset_file_size: 91565, created_at: "2012-07-17 12:45:30", updated_at: "2012-07-17 12:45:30"> 
p.asset.url 
    => "http://s3.amazonaws.com/assets.tests/my_assets_path/10/original.jpg" 

Sin embargo, yo no sé si este método funcionará en Heroku (tengo mi aplicación en él).

¿No hay una forma mejor sin pasar por un archivo temporal?

Respuesta

22

Buen momento. Acabo de enviar una solicitud de extracción que fue parcheada hace unas horas (20 de julio de 2012) que debería hacer su vida realmente fácil.

self.asset = URI.parse("http://s3.amazonaws.com/blah/blah/blah.jpg") 

Esto descargará su imagen jpeg, asegúrese de que el nombre del archivo es blah.jpg y el tipo de contenido es 'imagen/jpg'

Paperclip versión> 3.1.3 (que tendrá que vincularlo a github repo hasta que se libere).

ACTUALIZACIÓN: confirmado trabajando con versión de clip> = 3.1.4

+2

¡Estás comprometido funciona como un encanto! Y ahora está incluido en el clip 3.1.4 Es lo que quería. ¡Muy buen trabajo! ¡Gracias! –

+2

Confirmado, funciona muy bien con paperclip 3.1.4. Usted acaba de hacer mi día. ¡Gracias! –

Cuestiones relacionadas