urllib2/httplib and email mime
John J. Lee
jjl at pobox.com
Fri Aug 22 10:18:42 EDT 2003
someone at arbitrary.org (Joseph) writes:
> I am using email to create a multipart message that I need to post to
> a url.
>
> I have been doing it semi-manually with httplib:
[...]
> Can someone sugest a cleaner way of doing this sort of thing using
> urllib2? The problem is getting the Content-Type header from my email
> object to be used by urllib2 as an http header.
http://wwwsearch.sourceforge.net/ClientForm/src/README-0_1_7b.html
(note only 0.1.x versions do file upload, not 0.0.x)
I haven't added file upload to the long example on that page, so
here's one:
import urllib2, ClientForm
# url here is URL of web page containing the form you're submitting
response = urllib2.urlopen(url)
forms = ClientForm.ParseResponse(response)
response.close()
form = form[0]
for name in filenames:
f = file(filename) # use StringIO if you have a string to upload
# mimetype and filename are optional
form.add_file(f, "text/plain", "upload.txt")
# (do other form-filling if necessary)
request = form.click()
response2 = urllib2.urlopen(request)
response2.read() # body
response2.info() # headers
You can cache the form (in a class, on on disk with pickle) or the
HTML (ClientForm.ParseFile is useful for that) if you don't want to
fetch the form page every time you submit a form.
A minor wart I just noticed: ClientForm only reads from the files when
you actually do form.click(), so the code above relies on Python to
close the file objects you're uploading from (not a problem in
CPython). Also, I haven't yet tested multifile upload on anything but
Python's cgi module -- but I'm likely to fix it quickly if it doesn't
work. And I'm sure my MIME code isn't as sophisticated as the email
module -- for example, it doesn't yet guess MIME types.
HTH
John
More information about the Python-list
mailing list