1

この質問はこれに関連しています
そこでChrisが説明している問題を読んでください。ファイル名が utf-8 でエンコードされていて、非 Unicode プログラムでサポートされている範囲外の文字が含まれている場合、CURL エラー 26 が発生します。
私は自分自身を説明しましょう:

local_filename = filename.encode("utf-8")
self.curl.setopt(self.curl.HTTPPOST, [(field, (self.curl.FORM_FILE, local_filename, self.curl.FORM_FILENAME, local_filename))])

非ユニコード プログラムの言語としてロシア語が設定された Windows 7 を使用しています。ファイル名を utf-8 にエンコードせず ( pycurl( ではfilenameなく.local_filename私が合格した場合local_filename(UTF-8 にエンコードされているため)、ロシア語の文字でさえ許可されません

4

2 に答える 2

2

これは答えるのは簡単ですが、修正するのは難しいです:

pycurl はフォームポストに libcurl を使用します。libcurl は、単純な fopen() を使用して、投稿用のファイルを開きます。したがって、libcurl が開いてローカル ファイル システムから読み取る正確なファイル名を指定する必要があります。

于 2013-06-07T22:32:08.817 に答える
2

この問題を 2 つのコンポーネントに分解します。

  1. ファイルデータを読み取るために開くファイルをpycurlに指示します
  2. ファイル名を正しいエンコーディングでサーバーに送信する

これらは同じエンコーディングである場合とそうでない場合があります。

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 の間でエンコーディングが異なる場合はカバーされていません。

ただし、始めるには十分なはずですよね?

于 2013-06-09T12:21:51.307 に答える