2008-09-29 11 views
7

Dies ist ein fast-Duplikat von Send file using POST from a Python script, aber ich möchte einen Vorbehalt hinzufügen: Ich brauche etwas, das richtig die Codierung von Feldern und angehängten Dateien behandelt. Die Lösungen, die ich gefunden habe, explodieren, wenn Sie Unicode-Strings mit nicht-ASCII-Zeichen in den Mix werfen. Außerdem codieren die meisten Lösungen keine base64-codierten Daten, um die 7-Bit-Daten sauber zu halten.Senden Sie Datei mit POST von einem Python-Skript

Antwort

5

Das Beste, was mir einfällt, ist, es selbst zu kodieren. Wie wäre es mit dieser Subroutine?

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 

(Okay, dieser Code sendet nur POST-Daten. Aber Sie wollen offenbar mehren-codierten Daten, als ob Sie eine „Datei hochladen“ klicken, nicht wahr? Nun, es ist eine ziemlich einfache Kombination von dem, was Ich habe hier und die Antworten von der Frage, die Sie verknüpft haben.)

1

PyCURL bietet eine Schnittstelle zu CURL von Python.

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

Locken tun alles, was Sie brauchen. Es kann Binärdateien ordnungsgemäß übertragen und unterstützt viele Codierungen. Sie müssen jedoch sicherstellen, dass die richtige Zeichencodierung als benutzerdefinierte Header beim POST-Dateien.

Insbesondere müssen Sie unter Umständen eine 'Datei-Upload' -Stil POST tun:

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

Mit curl (oder einen anderen HTTP-Client) können Sie den Inhalt Codierung eingestellt haben:

Inhaltstyp: text/html; charset = UTF-8

Beachten Sie außerdem, dass die Request-Header ascii sein muss, und dazu gehört auch die url (so stellen Sie sicher, dass Sie richtig Ihre möglicherweise Unicode-URLs entkommen. Es gibt Unicode für die HTTP-Header entkommt) Diese

http://bugs.python.org/issue3300

ich hoffe, das hilft, gibt weitere Informationen über das Thema, einschließlich der Einrichtung Ihres Standardzeichensatz auf dem Server, usw.