回形针:从带有扩展名的网址上传

时间:2012-07-17 13:07:41

标签: ruby-on-rails ruby ruby-on-rails-3 heroku paperclip

我想通过paperclip在S3存储上传网址中的图片。 我合作:

Ruby 1.9.3
Rails 3.2.6
paperclip 3.1.3
aws-sdk 1.3.9

我有我的照片模型:

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 

所以基本上我这是从URL下载我的文件:

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

但它使用错误的file_name保存我的文件,并且它没有设置文件的扩展名:

#<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.

如您所见,没有扩展名。

我找到了一种方法来解决它,但我相信我可以有更好的方法。这个解决方案是在我的计算机上复制文件然后我在S3上发送它:

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

这适用于我的电脑:

#<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"

但是我不知道这个方法是否适用于Heroku(我在其上托管我的应用程序)。

没有通过临时文件的更好方法?

1 个答案:

答案 0 :(得分:22)

好时机。我刚刚发送了一个拉片请求,该请求在几个小时前(2012年7月20日)修补,这应该会让您的生活变得轻松。

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

这将下载你的jpeg图片,确保文件名为blah.jpg,内容类型为'image / jpg'

Paperclip版本&gt; 3.1.3(你需要将它链接到github repo,直到它被释放)。

更新:已确认使用回形针版本&gt; = 3.1.4