attachment_fu is fantastic, but it’s a bit limited for some purposes. Ever wanted to upload data from a URL instead of making people upload files? It’s a common problem!
Presume that we have a model named Image, which is our target for attachment_fu. Adding URL upload capability is surprisingly simple:
class Image < ActiveRecord::Base # Standard attachment_fu inclusion here has_attachment :storage => :file_system, :content_type => :image, :resize_to => "1024x1024>", :path_prefix => "public/images/cache/attached", :format => "jpg" # Allows the direct assignment of a URL to this image, # which is the source image to save from def url=(v) self.uploaded_data = UrlUpload.new(v) end # Or, we can just pass a URL to Image#uploaded_data def uploaded_data=(url) if url.is_a? String and url.match /^http(s)?:\/\// then file = open(url) file.extend(UrlUpload) super(file) else super(url) end end end module UrlUpload def filename base_uri.to_s.split("/").last end def original_filename base_uri.to_s.split("/").last end end
There you go. All you need now is
Image.create(:url => "http://some.url/to/an/image.png") and when the model is saved, the image will be sucked down and saved. Easy!