Monday, July 07, 2008

Submit Multipart Form Programmatically.

I had a requirement where one application wanted to talk to another application for uploading a video.
I couldn't leverage Active Resource since it doesn't seem to have option to submit multipart data. I came up a with a solution to use mechanize along with Hpricot.


class BasicAuthMechanize < WWW::Mechanize
def set_headers(u, r, c)
super(u, r, c)
r.basic_auth(API_KEY, 'X')
r
end
end

agent = BasicAuthMechanize.new
url = ""

node = Hpricot::Elem.new(Hpricot::STag.new('form'))
node['action'] = url
node['method'] = 'POST'
node['enctype'] = 'multipart/form-data'

form = WWW::Mechanize::Form.new(node)
form.fields << WWW::Mechanize::Form::Field.new("video_image[video_id]",video_id)
form.file_uploads << WWW::Mechanize::Form::FileUpload.new("video_image[uploaded_data]", file_path)

page = agent.submit(form)
return page.response['status'].to_i == 200 # Success