0

After searching for how to POST large files using python, I came across this and I wrote a program based on that, but when I run it I get the following error message:

 Traceback (most recent call last):
 File "Test3.py", line 187, in <module>
 main()
 File "Test3.py", line 184, in main
 do_upload(options, args)
 File "Test3.py", line 48, in do_upload
 response = urllib2.urlopen(request)
 File "C:\Python27\lib\urllib2.py", line 126, in urlopen
 return _opener.open(url, data, timeout)
 File "C:\Python27\lib\urllib2.py", line 400, in open
 response = meth(req, response)
 File "C:\Python27\lib\urllib2.py", line 513, in http_response
 'http', request, response, code, msg, hdrs)
 File "C:\Python27\lib\urllib2.py", line 438, in error
 return self._call_chain(*args)
 File "C:\Python27\lib\urllib2.py", line 372, in _call_chain
 result = func(*args)
 File "C:\Python27\lib\urllib2.py", line 521, in http_error_default
 raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 500: Internal Server Error

and here is my code, to run the program I use --upload "path_to_file" [space] "filename". I'm new to python programming so most of this still confuses me.

def do_upload(options, args):
 url = 'http://127.0.0.1/test_server/upload'
 path = args[0]
 # print path
 filename = args[1]
 if not os.access(args[0], os.F_OK):
 print "Directory/file Doesn't exist"
 exit(1)
 os.chdir(path)
 f = open(filename, 'rb')
 mmapped_file_as_string = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
 request = urllib2.Request(url, mmapped_file_as_string)
 contenttype = mimetypes.guess_type(filename)[0] 
 request.add_header(contenttype, 'application/octet-stream')
 response = urllib2.urlopen(request)
 #close everything
 mmapped_file_as_string.close()
 f.close()

UPDATE

I have changed the code from above and now I'm getting some socket error.

Updated code

def do_upload(options, args):
 host = 'http://localhost:80'
 selector = '/test_server/upload'
 url = 'http://localhost:80/test_server/upload'
 if len(args) == 2:
 print "len of args = 2"
 files = "File is " + str(args[1])
 print files
 path = args[0]
 print "Path is " + str(args[0])
 content_type, body = encode_multipart_formdata(files)
 h = httplib.HTTP(host)
 h.putrequest('POST', selector)
 h.putheader('content-type', content_type)
 h.putheader('content-length', str(len(body)))
 h.endheaders()
 h.send(body)
 errcode, errmsg, headers = h.getreply()
 return h.file.read()
 f = open(files, 'rb')
 mmapped_file_as_string = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
 request = urllib2.Request(url, mmapped_file_as_string)
 request.add_header('Content-Type', content_type)
 response = urllib2.urlopen(request)
 mmapped_file_as_string.close()
 f.close()
def encode_multipart_formdata(files):
 BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
 CRLF = '\r\n'
 L = []
 for (filename) in files:
 L.append('--' + BOUNDARY)
 L.append('Content-Disposition: form-data; filename="%s"' % (filename))
 L.append('Content-Type: %s' % get_content_type(filename))
 L.append('')
 #L.append(value)
 L.append('--' + BOUNDARY + '--')
 L.append('')
 body = CRLF.join(L)
 content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
 return content_type, body
def get_content_type(filename):
 return mimetypes.guess_type(filename)[0] or 'application/octet-stream'

Error message

Traceback (most recent call last):
 File "Test3.py", line 208, in <module>
 main()
 File "Test3.py", line 205, in main
 do_upload(options, args)
 File "Test3.py", line 41, in do_upload
 h.endheaders()
 File "C:\Python27\lib\httplib.py", line 951, in endheaders
 self._send_output(message_body)
 File "C:\Python27\lib\httplib.py", line 811, in _send_output
 self.send(msg)
 File "C:\Python27\lib\httplib.py", line 773, in send
 self.connect()
 File "C:\Python27\lib\httplib.py", line 754, in connect
 self.timeout, self.source_address)
 File "C:\Python27\lib\socket.py", line 553, in create_connection
 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.gaierror: [Errno 11004] getaddrinfo failed
asked May 29, 2012 at 15:47
2
  • can you post test_server/upload code??? Commented May 29, 2012 at 15:49
  • Done ! , I like to mention one thing , I was able to upload files using cURL with out any problems. Commented May 29, 2012 at 15:52

1 Answer 1

4

You are setting a non-existing header instead of the Content-Type header:

request.add_header(contenttype, 'application/octet-stream')

Change that to:

request.add_header('Content-Type', contenttype)

instead.

Your biggest problem however is that you are not uploading a multipart POST, but rather just the file itself as the POST body, while your server is expecting only a multipart upload.

Take a look at this SO answer for a very simple way to generate a proper multipart POST body: https://stackoverflow.com/a/681182/100297. Note that you'll have to adjust your Content-Type header accordingly.

answered May 29, 2012 at 15:58
Sign up to request clarification or add additional context in comments.

8 Comments

That Didn't fix it , it changed the first 3 lines from the error messaged and replace them with these File "Test3.py", line 178, in <module> main() File "Test3.py", line 175, in main do_upload(options, args) File "Test3.py", line 39, in do_upload response = urllib2.urlopen(request)
Thanks, Looking at the code I'm a little confused as to what def post_multipart(host, selector, fields, files): the selector in that function means
It's the path portion of the URL; /test_server/upload in your case.
So Host = 127.0.0.1 Selector = /test_server/upload Field = Myfile files = Path to file+filename ?
Your error menas there is no such host ('http://localhost:80'). Read the documentation for HTTP and you'll see you need to provide a bare hostname, so 'localhost'.
|

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.