HTTP afficher les fichiers binaires à l'aide de Python: concis non-pycurl exemples?
Je suis intéressé par l'écriture d'un court script python qui télécharge un court fichier binaire (.wav/.raw audio) via une requête POST vers un serveur distant.
Je l'ai fait avec pycurl, ce qui le rend très simple et les résultats dans une brève script; malheureusement, il faut aussi que la fin
l'utilisateur ont pycurl installé, je ne peux pas compter sur.
J'ai aussi vu quelques exemples dans d'autres posts qui s'appuient uniquement sur les bibliothèques de base, urllib, urllib2, etc., cependant, en général, semblent être assez détaillées, ce qui est aussi quelque chose que j'aimerais éviter.
Je me demande s'il y a des exemples concis qui ne nécessitent pas l'utilisation de bibliothèques externes, et qui sera rapide et facile pour la 3ème parties à comprendre, même si elles ne sont pas particulièrement familier avec python.
Ce que j'utilise à l'heure actuelle ressemble,
def upload_wav( wavfile, url=None, **kwargs ):
"""Upload a wav file to the server, return the response."""
class responseCallback:
"""Store the server response."""
def __init__(self):
self.contents=''
def body_callback(self, buf):
self.contents = self.contents + buf
def decode( self ):
self.contents = urllib.unquote(self.contents)
try:
self.contents = simplejson.loads(self.contents)
except:
return self.contents
t = responseCallback()
c = pycurl.Curl()
c.setopt(c.POST,1)
c.setopt(c.WRITEFUNCTION, t.body_callback)
c.setopt(c.URL,url)
postdict = [
('userfile',(c.FORM_FILE,wavfile)), #wav file to post
]
#If there are extra keyword args add them to the postdict
for key in kwargs:
postdict.append( (key,kwargs[key]) )
c.setopt(c.HTTPPOST,postdict)
c.setopt(c.VERBOSE,verbose)
c.perform()
c.close()
t.decode()
return t.contents
ce n'est pas exact, mais il vous donne l'idée générale. Il fonctionne très bien, il est simple pour la 3ème parties à comprendre, mais il exige pycurl.
OriginalL'auteur si28719e | 2009-08-12
Vous devez vous connecter pour publier un commentaire.
L'affichage d'un fichier nécessite
multipart/form-data
de codage et, autant que je sache, il n'y a pas de moyen facile (c'est à dire d'un revêtement ou de quelque chose) pour ce faire avec le stdlib. Mais comme vous l'avez mentionné, il ya beaucoup de recettes là-bas.Bien qu'ils semblent détaillé, votre cas d'utilisation, suggère que vous pouvez probablement juste de l'encapsuler une fois dans une fonction ou de la classe et de ne pas trop s'inquiéter, non? Jetez un oeil à la recette sur ActiveState et de lire les commentaires pour suggestions:
ou voir le
MultiPartForm
classe dans cette PyMOTW, ce qui semble assez réutilisable:Je crois que les deux gérer des fichiers binaires.
OriginalL'auteur ars
J'ai rencontré le même problème aujourd'hui, après avoir essayé les deux et pycurl et multipart/form-data, je décide de lire python httplib/urllib2 code source pour le savoir, j'ai eu un comparable bonne solution:
Voici le code:
voir mon blog: http://www.2maomao.com/blog/python-http-post-a-binary-file-using-urllib2/
OriginalL'auteur Realfun
Je sais que c'est un vieux de la vieille de la pile, mais j'ai une autre solution.
Si vous êtes allé à travers les difficultés de la construction de toute la magie des en-têtes et tout et tout, et sont seulement BOULEVERSÉ que, soudain, un fichier binaire ne peut pas passer parce que la bibliothèque python est dire.. vous pouvez monkey patch une solution..
Si vous utilisez http://au lieu de https://, puis remplacez toutes les instances de HTTPSConnection ci-dessus avec HTTPConnection.
Avant que les gens se fâcher avec moi, OUI, c'est une MAUVAISE SOLUTION, mais c'est un moyen de corriger le code existant, vous ne voulez vraiment pas à re-ingénieur à le faire d'une autre manière.
Pourquoi cela est-il résoudre ce problème? Aller les chercher à la source Python, httplib.py fichier.
OriginalL'auteur tara
Comment urllib beaucoup plus détaillé? Vous construisez postdict fondamentalement de la même manière, sauf que vous commencez avec
Une fois que vous vave postdict,
et puis, vous obtenez et enregistrer
resp.read()
et peut-être vulgaire et essayer de JSON-chargement si nécessaire. Me semble qu'il serait effectivement plus court! Que suis-je en manque...?OriginalL'auteur Alex Martelli
urllib.urlencode n'aime pas certains types de données binaires.
OriginalL'auteur Leo