Rails 3,Paperclip以及从远程URL上传图像

7

我编写了一段简单的代码,它可以获取图片的URL,并将其缩放后上传到Amazon S3存储。代码如下:

  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

它能够正常工作,但是图片的质量很低。可能存在什么问题?


1
你的原始图像将变为“128x128”像素,这是你的意图吗?“低质量”如何定义,在压缩率方面? - andrea
这是正确的 - 我原始图像的尺寸为“128x128”,我已经尝试通过这样做来定义质量::style=>{:thumb=>{:quality=>100,...}},但它仍然返回相同的结果。 - spacemonkey
1
嘿,这个很好用!我在想,你能否解释一下 'def io.original_filename; base_uri.path.split('/').last; end' 这一行的含义?你是在声明一个函数吗?分号是干什么用的? - TenJack
1
@TenJack 这个语句 "def io.original_filename; base_uri.path.split('/').last; end",打开了 "io" 对象,并向其插入了一个名为 "original_filename" 的新方法,这仅在执行 "download_profile_pic" 方法时才会完成。分号可以用于在一行中有多行代码(如果这有意义的话(在上面的代码中,相同的内容可以用三行写成)。我还想指出,这段代码不是我写的,是某个聪明的人写的,我只是稍微修改了一下(尽我所记得的)。 - spacemonkey
1个回答

1

看起来问题在于您主要图像大小的几何字符串,请尝试更改:

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

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

只有在图像尺寸过大时才应该调整/转换图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接