2008-09-29 10 views
7

Il s'agit d'un quasi-doublon de Send file using POST from a Python script, mais je voudrais ajouter une mise en garde: J'ai besoin de quelque chose qui gère correctement l'encodage des champs et des fichiers joints. Les solutions que j'ai pu trouver explosent lorsque vous lancez dans le mixage des chaînes Unicode contenant des caractères non-ascii. De plus, la plupart des solutions ne codent pas en base 64 pour garder les choses propres en 7 bits.Envoyer un fichier à l'aide de POST à ​​partir d'un script Python

Répondre

5

La meilleure chose que je puisse penser est de l'encoder vous-même. Que diriez-vous de ce sous-programme?

from urllib2 import Request, urlopen 
from binascii import b2a_base64 

def b64open(url, postdata): 
    req = Request(url, b2a_base64(postdata), headers={'Content-Transfer-Encoding': 'base64'}) 
    return urlopen(req) 

conn = b64open("http://www.whatever.com/script.cgi", u"Liberté Égalité Fraternité") 
# returns a file-like object 

(D'accord, donc ce code envoie juste POST-données. Mais vous voulez apparemment des données multipart codé, comme si vous avez cliqué sur un bouton « Envoyer un fichier », non? Eh bien, il est une combinaison assez simple de ce J'ai ici et les réponses de la question que vous avez liée.)

1

PyCURL fournit une interface à CURL à partir de Python.

http://curl.haxx.se/libcurl/python/

Curl fera tout ce que vous avez besoin. Il peut transférer des fichiers binaires correctement, et supporte de nombreux encodages. Cependant, vous devez vous assurer que le codage de caractères approprié est un en-tête personnalisé lors de l'envoi de fichiers.

Plus précisément, vous devrez peut-être faire un style 'télécharger le fichier' POST:

http://curl.haxx.se/docs/httpscripting.html (section 4.3)

Avec boucle (ou tout autre client HTTP), vous devez procéder à l'encodage de contenu:

Type de contenu: text/html; charset = UTF-8

En outre, il faut savoir que les en-têtes de demande doivent être ascii, et cela inclut l'URL (alors assurez-vous échapper correctement vos URL éventuellement unicode. Il y a unicode échappe pour les en-têtes HTTP) Cette a récemment été fixé en Python:

http://bugs.python.org/issue3300

J'espère que cette aide, il y a plus d'informations sur le sujet, y compris la configuration de votre caractère par défaut défini sur votre serveur, etc.

Questions connexes