尋找如何發佈使用Python大文件後,我碰到this和我寫了基於這樣的軟件,但是當我運行它,我得到了以下錯誤消息:Python的HTTP POST失敗
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
這裏是我的代碼,運行我使用--upload "path_to_file" [space] "filename"
的程序。我是python編程新手,所以大部分內容仍然讓我困惑。
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
我從上面,現在我得到一些套接字錯誤改變了代碼。
更新代碼
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'
錯誤消息
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
你能發表'test_server/upload'代碼嗎? – dm03514
完成! ,我想提一件事情,我可以使用cURL上傳文件,但沒有任何問題。 – cyberbemon