2012-05-29 2 views
0

После поиска как POST больших файлов с помощью 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 
+0

Вы можете отправить код 'test_server/upload' ??? – dm03514

+0

Сделано! , Я хотел бы упомянуть одно, я смог загружать файлы с помощью cURL без каких-либо проблем. – cyberbemon

ответ

4

Вы устанавливаете несуществующее заголовок вместо заголовка Content-Type:

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

Изменить это на:

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

вместо этого.

Ваша самая большая проблема заключается в том, что вы не загружаете многостраничный POST, а скорее сам файл как тело POST, в то время как ваш сервер ожидает только многостраничную загрузку.

Взгляните на этот SO-ответ для очень простого способа создания правильного многочастного тела POST: https://stackoverflow.com/a/681182/100297. Обратите внимание, что вам придется соответствующим образом настроить заголовок Content-Type.

+0

Это не исправить, оно изменило первые 3 строки сообщения об ошибке и заменило их на «Файл» Test3.py », строка 178, в main() Файл« Test3.py », строка 175 , в основном do_upload (options, args) Файл «Test3.py», строка 39, в do_upload Ответ = urllib2.urlopen (запрос) ' – cyberbemon

+0

Спасибо, Посмотрев на код, я немного смущен относительно того, что' def post_multipart (хост, селектор, поля, файлы): 'селектор в этой функции означает – cyberbemon

+0

Это часть пути URL-адреса; '/ test_server/upload' в вашем случае. –