2011-01-31 17 views
7

Escribí un código simple que toma la url de una imagen y carga una versión de tamaño reducido a la de Amazon S3. El código se ve así:Rails 3, clip de papel y cargar imagen desde la url remota

attr_accessor :profile_image_url 

    has_attached_file :avatar, 
    :default_url => "/system/avatars/:style_default.png", 
    :styles => { 
     :original => "128x128#", 
     :thumb => "48x48#" 
    }, 
    :storage => :s3, 
    :s3_credentials => "#{RAILS_ROOT}/config/s3.yml", 
    :path => "/avatars/:id/:style.:extension" 

    before_validation :download_profile_pic 
... 

    def download_profile_pic 
    begin 
     io = open(URI.parse(self.profile_image_url)) 
     def io.original_filename; base_uri.path.split('/').last; end 
     self.avatar = io.original_filename.blank? ? nil : io 
    rescue Timeout::Error 
     self.avatar = nil 
    rescue OpenURI::Error => e 
     self.avatar = nil 
    end 
    end 

Funciona, pero las imágenes se cargan en una calidad muy baja. ¿Qué podría ser un problema?

+1

su imagen original se convertirá en "128x128" px, ¿es su intención? definir baja calidad, en tasa de compresión? – andrea

+0

esto es correcto - mis dimensiones de la imagen original son "128x128", y he intentado definir la calidad haciendo algo así: style => {: thumb => {: quality => 100, ...}} y aún así regresó mismo resultado – spacemonkey

+1

¡Oye, esto funciona genial! Me preguntaba, ¿podría explicar el 'def io.original_filename'; base_uri.path.split ('/'). last; terminar la línea un poco? ¿Estás declarando una función aquí? y para que sirve el punto y coma? – TenJack

Respuesta

1

Parece que el problema es la cadena de la geometría del tamaño de su imagen principal, pruebe a cambiar:

:styles => { 
    :original => "128x128#", 
    :thumb => "48x48#" 
}, 

a

:styles => { 
    :original => "128x128>", 
    :thumb => "48x48#" 
}, 

que sólo debe cambiar el tamaño/transformar la imagen si las dimensiones son demasiado grande.

Cuestiones relacionadas