2012-05-29 4 views
0

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 
+0

pouvez-vous poster le code 'test_server/upload' ??? – dm03514

+0

Terminé! , Je tiens à mentionner une chose, j'ai été en mesure de télécharger des fichiers en utilisant cURL sans problèmes. – cyberbemon

Répondre

4

Vous définissez un en-tête non-existant au lieu de l'en-tête Content-Type:

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

Remplacez cela par:

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

à la place. Votre plus gros problème cependant est que vous ne téléchargez pas un POST en plusieurs parties, mais plutôt le fichier lui-même en tant que corps POST, alors que votre serveur attend seulement un téléchargement en plusieurs parties.

Jetez un oeil à cette réponse SO pour une manière très simple de générer un corps POST en plusieurs parties: https://stackoverflow.com/a/681182/100297. Notez que vous devrez ajuster votre en-tête Content-Type en conséquence.

+0

Cela ne l'a pas réparé, il a changé les 3 premières lignes de l'erreur message et les remplacer par ces 'File" Test3.py ", ligne 178, dans main() Fichier" Test3.py ", ligne 175 , dans principal do_upload (options, args) Fichier "Test3.py", ligne 39, dans do_upload réponse = urllib2.urlopen (demande) ' – cyberbemon

+0

Merci, En regardant le code, je suis un peu confus quant à ce' def post_multipart (hôte, sélecteur, champs, fichiers): 'le sélecteur dans cette fonction signifie – cyberbemon

+0

C'est la partie chemin de l'URL; '/ test_server/upload' dans votre cas. –