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

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

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://sofzh.miximages.com/ruby-on-rails/my_picture.jpg")) picture.save 

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

 # 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://sofzh.miximages.com/ruby-on-rails/my_picture.jpg").read end picture = Asset::Picture.new(asset: open(filename)) picture.save 

这适用于我的电脑:

 # p.asset.url => "http://s3.amazonaws.com/assets.tests/my_assets_path/10/original.jpg" 

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

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

好时机。 我刚刚发送了一个在几个小时前(2012年7月20日)修补的拉取请求,这将使您的生活变得简单。

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

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

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

更新:确认使用回形针版本> = 3.1.4