Friday, 5 December 2008
Posting a file with ActiveResource
« Relay mail via Google SMTP or AuthSMTP with Postfix | Main | Geokit geocoding with multiple matches »
Recently I had to put or post files to a web service using ActiveResource. I thought that it was a common tasks but, after searching a bit, I wasn't able to find any documentation about how to do that and so I ended up implementing my dirty solution.
Luckily, Rails already knows how to parse a file parameter so I only had to produce an XML conforming to what that parameter parser expects.
If you, like me, are receiving the file from a multipart/form-data form in a Rails application, then you have an UploadedStringIO instance to play with:
module ActionController
class UploadedStringIO
def to_xml(options = {})
options[:indent] ||= 2
xml = options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
xml.instruct! unless options[:skip_instruct]
dasherize = !options.has_key?(:dasherize) || options[:dasherize]
_root = options[:root] || 'file'
root_tag = dasherize ? _root.to_s.dasherize : _root.to_s
xml.tag!(root_tag, ActiveSupport::Base64.encode64(string), :type => 'file', :name => original_path,
(dasherize ? 'content-type' : 'content_type') => content_type)
end
end
end
With that, if you have a Tournament model, with a flier attribute and you assign to it a text file (file name: flier.txt, file content: abc) then ActiveResource will post/put something like:
<?xml version="1.0" encoding="UTF-8"?> <tournament> <flier type="file" name="flier.txt" content-type="text/plain">YWJj </flier> </tournament>
that is what Rails wants.
Technorati Tags: Ruby on Rails ActiveResource
