DZone Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world
Make A Remote URL Work Like A File Upload (in Rails)
Want to load a remote URL into an acts_as_attachment/attachment_fu model? Use this little utility class.
class UrlUpload
EXTENSIONS = {
"image/jpeg" => ["jpg", "jpeg", "jpe"],
"image/gif" => ["gif"],
"image/png" => ["png"]
}
attr_reader :original_filename, :attachment_data
def initialize(url)
@attachment_data = open(url)
@original_filename = determine_filename
end
# Pass things like size, content_type, path on to the downloaded file
def method_missing(symbol, *args)
if self.attachment_data.respond_to? symbol
self.attachment_data.send symbol, *args
else
super
end
end
private
def determine_filename
# Grab the path - even though it could be a script and not an actual file
path = self.attachment_data.base_uri.path
# Get the filename from the path, make it lowercase to handle those
# crazy Win32 servers with all-caps extensions
filename = File.basename(path).downcase
# If the file extension doesn't match the content type, add it to the end, changing any existing .'s to _
filename = [filename.gsub(/\./, "_"), EXTENSIONS[self.content_type].first].join(".") unless EXTENSIONS[self.content_type].any? {|ext| filename.ends_with?("." + ext) }
# Return the result
filename
end
end
Now when you have the URL you want to load, do something like this:
@model.uploaded_data = UrlUpload.new(url)
Or better yet, make a pseudo-accessor on your aaa/attachment_fu model so you can stay "model-heavy".
def url=(value) self.uploaded_data = UrlUpload.new(value) end






Comments
Snippets Manager replied on Fri, 2009/09/18 - 1:06pm
Levi Kopsen replied on Wed, 2009/09/09 - 8:03am
Snippets Manager replied on Fri, 2009/09/18 - 1:06pm
fjkkj jkldsjfklj replied on Mon, 2009/07/06 - 5:48am
Snippets Manager replied on Thu, 2009/06/25 - 6:40am
gfdgf fgds replied on Tue, 2009/06/16 - 5:44am
gfdgf fgds replied on Thu, 2009/06/18 - 5:41am
gfdgf fgds replied on Tue, 2009/06/16 - 5:44am
kjh;kljh hkjhkjg replied on Mon, 2009/06/15 - 7:18am
Snippets Manager replied on Wed, 2009/06/03 - 4:31am
Snippets Manager replied on Tue, 2009/06/02 - 11:06am
gfgfg fgfgf replied on Mon, 2009/06/01 - 11:49pm
Snippets Manager replied on Sun, 2007/12/16 - 4:43pm
Snippets Manager replied on Tue, 2007/11/20 - 5:21am
Snippets Manager replied on Mon, 2006/11/27 - 11:49pm
Snippets Manager replied on Wed, 2006/03/29 - 10:25pm
# Make it always write to tempfiles, never StringIO OpenURI::Buffer.module_eval { remove_const :StringMax const_set :StringMax, 0 }