この問題を 2 つのコンポーネントに分解します。
- ファイルデータを読み取るために開くファイルをpycurlに指示します
- ファイル名を正しいエンコーディングでサーバーに送信する
これらは同じエンコーディングである場合とそうでない場合があります。
1 の場合、sys.getfilesystemencoding()
Unicode ファイル名 (Python コード全体で正しく使用されます) を、pycurl/libcurl が で正しく開くことができる文字列に変換するために使用しますfopen()
。strace
(linux) または同等の Windows osxを使用して、正しいファイル パスが pycurl によって開かれていることを確認します。
それが完全に失敗した場合は、いつでも を介して Python からファイル データ ストリームをフィードできますpycurl.READFUNCTION
。
2 については、ファイルのアップロード中にファイル名がどのように送信されるかを学びます (例) 。たとえば、非常に長いファイル名に関しては、それが些細なことではないことはわかっていますが、良いリンクはありません。
私はあなたのコード スニペットをハックしましたnc -vl 5050
。
#!/usr/bin/python
import pycurl
c = pycurl.Curl()
filename = u"example-\N{EURO SIGN}.mp3"
with open(filename, "wb") as f:
f.write("\0\xfffoobar\x07\xff" * 9)
local_filename = filename.encode("utf-8")
c.setopt(pycurl.HTTPPOST, [("xxx", (pycurl.FORM_FILE, local_filename, pycurl.FORM_FILENAME, local_filename))])
c.setopt(pycurl.URL, "http://localhost:5050/")
c.setopt(pycurl.HTTPHEADER, ["Expect:"])
c.perform()
私のテストでは、OS と HTTP の間でエンコーディングが異なる場合はカバーされていません。
ただし、始めるには十分なはずですよね?