Partage
  • Partager sur Facebook
  • Partager sur Twitter

Upload une image par HTTP en utilisant urllib ?

Sujet résolu
    3 décembre 2010 à 19:08:31

    Bonsoir!

    Voilà je cherche à upload une image par une requête POST en utilisant urllib(2), malheureusement mon code ne fonctionne pas ... il me dit que je dois envoyer une requête POST en multipart/form-data !

    Mon code :
    import socket
    import urllib
    import urllib2
    
    API_KEY = '4BCDHLRS2bd2fe48f73c3925eb7685b6d54dd2b2'
    IMAGE_API_URL = 'http://www.imageshack.us/upload_api.php'
    HTTP_UPLOAD_TIMEOUT = 300
    
    def uploadfile(filename):
    	data = urllib.urlencode({'fileupload':open(filename, 'rb'), 'key':API_KEY, 'rembar':'no', 'public':'yes'})
    	request = urllib2.Request(IMAGE_API_URL, data, {})
    	socket.setdefaulttimeout(HTTP_UPLOAD_TIMEOUT)
    	result = urllib2.urlopen(request)
    	return result.read()
    


    Et la réponse du serveur :
    '<links>\n<error id="parameter_missing">Sorry, but we\'ve detected that unexpected data is received. Required parameter \'fileupload\' is missing or your post is not multipart/form-data</error>\n</links>\n'
    


    Merci d'avance, Menace.
    • Partager sur Facebook
    • Partager sur Twitter
      3 décembre 2010 à 19:22:37

      Quand tu appelles urllib2.Request, tu peux passer des headers personnalisés en argument, via un dictionnaire. Dans ton cas ça doit être le header "Content-Type" qui doit prendre la valeur "multipart/form-data". Les détails devraient être dans la doc.
      • Partager sur Facebook
      • Partager sur Twitter

      Blond, bouclé, toujours le sourire aux lèvres...

        3 décembre 2010 à 19:54:31

        J'ai trouvé ça sur internet, mais malheureusement cela ne m'aide pas ... enfin je trouve pas d'exemples et du coup je sais pas du tout comment l'utiliser ...

        import httplib, mimetypes
        
        def post_multipart(host, selector, fields, files):
            """
            Post fields and files to an http host as multipart/form-data.
            fields is a sequence of (name, value) elements for regular form fields.
            files is a sequence of (name, filename, value) elements for data to be uploaded as files
            Return the server's response page.
            """
            content_type, body = encode_multipart_formdata(fields, 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()
        
        def encode_multipart_formdata(fields, files):
            """
            fields is a sequence of (name, value) elements for regular form fields.
            files is a sequence of (name, filename, value) elements for data to be uploaded as files
            Return (content_type, body) ready for httplib.HTTP instance
            """
            BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
            CRLF = '\r\n'
            L = []
            for (key, value) in fields:
                L.append('--' + BOUNDARY)
                L.append('Content-Disposition: form-data; name="%s"' % key)
                L.append('')
                L.append(value)
            for (key, filename, value) in files:
                L.append('--' + BOUNDARY)
                L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, 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'
        
        • Partager sur Facebook
        • Partager sur Twitter
          3 décembre 2010 à 20:00:51

          Citation : FMIS@Menace.

          J'ai trouvé ça sur internet, mais malheureusement cela ne m'aide pas ...


          Sachant que dans l'exemple c'est la bibliothèque httplib qui est utilisée, ça risque pas de t'aider à utilier urllib2...

          Sinon dans la doc Python, il y a tout ce qu'il faut :
          http://docs.python.org/library/urllib2.html
          Même un exemple à la fin ;)
          • Partager sur Facebook
          • Partager sur Twitter

          Blond, bouclé, toujours le sourire aux lèvres...

            3 décembre 2010 à 20:50:24

            Je pense que j'ai pas trop compris comment ça marche ... Avec ce code j'ai toujours la même erreur ...
            import socket
            import urllib
            import urllib2
            
            API_KEY = '4BCDHLRS2bd2fe48f73c3925eb7685b6d54dd2b2'
            IMAGE_API_URL = 'http://www.imageshack.us/upload_api.php'
            HTTP_UPLOAD_TIMEOUT = 300
            
            def uploadfile(filename):
            	data = urllib.urlencode({'fileupload':open(filename, 'rb'), 'key':API_KEY, 'rembar':'no', 'public':'yes'})
            	request = urllib2.Request(IMAGE_API_URL, data, {})
            	request.add_header('Content-type', 'multipart/form-data')
            	socket.setdefaulttimeout(HTTP_UPLOAD_TIMEOUT)
            	result = urllib2.urlopen(request)
            	return result.read()
            
            • Partager sur Facebook
            • Partager sur Twitter
              4 décembre 2010 à 0:47:00

              Faut pas plutôt lire le fichier et passer son contenu plutôt que de passer la référence vers le fichier ? (ligne 10).
              • Partager sur Facebook
              • Partager sur Twitter

              Blond, bouclé, toujours le sourire aux lèvres...

                4 décembre 2010 à 0:50:16

                Déja essayé, toujours la même erreur. :/
                • Partager sur Facebook
                • Partager sur Twitter

                Upload une image par HTTP en utilisant urllib ?

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown