Après avoir cherché comment POST des fichiers volumineux en utilisant python, je suis tombé sur this et j'ai écrit un programme basé sur, mais quand je le lance, je reçois le message d'erreur suivant:Python HTTP Post échoue
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
et voici mon code, pour exécuter le programme, j'utilise --upload "path_to_file" [space] "filename"
. Je suis nouveau dans la programmation python, donc la plupart de mes problèmes me dérangent.
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()
MISE À JOUR
J'ai changé le code d'en haut et maintenant je reçois une erreur de socket.
code mis à jour
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'
Message d'erreur
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
pouvez-vous poster le code 'test_server/upload' ??? – dm03514
Terminé! , Je tiens à mentionner une chose, j'ai été en mesure de télécharger des fichiers en utilisant cURL sans problèmes. – cyberbemon