これは、 Send file using POST from a Python scriptのほぼ複製ですが、注意点を追加したいと思います: フィールドと添付ファイルのエンコーディングを適切に処理するものが必要です。非ASCII文字を含むUnicode文字列をミックスに投入すると、私が見つけた解決策は爆発します。また、ほとんどのソリューションでは、7 ビットをクリーンに保つためにデータを base64 エンコードしません。
3 に答える
私が考えることができる最善のことは、自分でエンコードすることです。このサブルーチンはどうですか?
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
(わかりました、このコードは POST データを送信するだけです。しかし、「ファイルのアップロード」ボタンをクリックしたかのように、マルチパートでエンコードされたデータが必要なようですよね? まあ、それは私がここに持っているものとからの答えの非常に簡単な組み合わせです.あなたがリンクした質問。)
このライブラリを使用してファイルを送信するだけです。
PyCURL は、Python から CURL へのインターフェイスを提供します。
http://curl.haxx.se/libcurl/python/
カールはあなたが必要とするすべてを行います。バイナリ ファイルを適切に転送でき、多くのエンコーディングをサポートします。ただし、ファイルを POST するときは、カスタム ヘッダーとして適切な文字エンコーディングを確認する必要があります。
具体的には、「ファイルのアップロード」スタイルの POST を実行する必要がある場合があります。
http://curl.haxx.se/docs/httpscripting.html (セクション 4.3)
curl (またはその他の HTTP クライアント) では、コンテンツのエンコーディングを設定する必要がある場合があります。
コンテンツ タイプ: テキスト/html; 文字セット=UTF-8
また、リクエスト ヘッダーは ascii である必要があり、これには URL が含まれていることに注意してください (したがって、Unicode の可能性のある URL を適切にエスケープするようにしてください。HTTP ヘッダーには Unicode エスケープがあります)。これは最近 Python で修正されました。
http://bugs.python.org/issue3300
サーバーでのデフォルトの文字セットの設定など、トピックに関する詳細情報があります。