I am automating the client side of a simple web interface. I need to upload a file to a webserver that requires authentication. I've got the authentication working with urllib2 (see below), but the only examples I've found to upload files use httplib without authentication. I'm competent with Python but no whiz with web api's. Could I get a little help please.
---------the form I'm trying to simulate looks like this---------------------- <FORM action=/cgi/upload.exe method=post encType=multipart/form-data> <INPUT type=file name=file></P> <INPUT type=submit value=Send> </FORM> ------------------my code follows--------------------------------------------- import urllib2, urllib, socket, base64, cookielib import webtools # from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146306 STANDARD_HEADERS = {'User-agent':'Mozilla/5.0 (compatible; MSIE 5.5; Windows NT)'} COOKIEFILE = 'cokies.lwp' socket.setdefaulttimeout(30) HTTP = "http://" HTTPS = "https://" #IP, UNAME, PW = "............." #deleted for security top_level_url = "http://..............." PasswordManager = urllib2.HTTPPasswordMgrWithDefaultRealm() PasswordManager.add_password(None, top_level_url, UNAME, PW) AuthenticationHandler = urllib2.HTTPBasicAuthHandler(PasswordManager) opener = urllib2.build_opener(AuthenticationHandler) urllib2.install_opener(opener) class MyConnection: def __init__(self, ipaddr="192.168.1.0", uname=None, password=None): self.SERVER_AND_PORT = "%s:81" % ipaddr self.UNAME = uname def getPage(self, url, kwargs, headers=None): headers = headers or STANDARD_HEADERS request = urllib2.Request(url, urllib.urlencode(kwargs), headers) handle = urllib2.urlopen(request) page = handle.read() handle.close() return page def getValidationReportsPage(self): ########this works self.getPage(HTTPS+self.SERVER_AND_PORT+"/cgi/listrpts.exe",{}) def login(self): #########this works try: print self.getPage(HTTPS+self.SERVER_AND_PORT+"/cgi/mainhtml.exe",{}) except: print 'login failed' def uploadFile(self, filepath): #????????????? need help here buffer = open(filepath).read() headers = dict(STANDARD_HEADERS) #make a copy parms = ('file', filepath, buffer ) contenttype, body = webtools.encode_multipart_formdata([], [parms]) headers['Content-Type']= contenttype data = {'file':body} self.getPage(HTTPS+self.SERVER_AND_PORT+"/cgi/upload.exe",data,headers) def unittest(): print 'start unittest of '+ __file__ X = MyConnection(uname=UNAME, password=PW) X.login() X.uploadFile('testdata/MouseMds.txt') if __name__ == "__main__": unittest() -------------------------------------------------------------------------------- You rock. That's why Blockbuster's offering you one month of Blockbuster Total Access, No Cost. --------------------------------------------------------------------------- The information contained in this message may be privileged and / or confidential and protected from disclosure. If the reader of this message is not the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited. If you have received this communication in error, please notify the sender immediately by replying to this message and deleting the material from any computer. --------------------------------------------------------------------------- -- http://mail.python.org/mailman/listinfo/python-list