1

私は最近、いくつかのアプリケーションで使用している PyCURL に裏打ちされたアップロード ダイアログを設計しました。
pycurl の HTTPPOST オプションを設定するときに問題が発生しました。次のように設定しています:
self.curl.setopt(self.curl.HTTPPOST, [(field, (self.curl.FORM_FILE, filename))])
filename が文字列の場合、すべて問題ありません。ただし、Unicode を渡すと、TypeError が発生します。キリル文字のパスを与える方法はありますか? UTF-8でエンコードしてみましたがだめでした。お時間をいただきありがとうございます

アップデート:

私は実際に WX コントロールからファイル名を取得しているので、触れる前に Unicode になっています。次に、それを UTF-8 にエンコードすると (filename = filename.encode('UTF-8') を使用)、setopt は正常に動作しますが、実行時にすべてが失敗します。

* About to connect() to example.com port 80 (#0)
*   Trying 123.123.123.123... * connected
* Connected to example.com (123.123.123.123) port 80 (#0)
* failed creating formpost data
* Connection #0 to host example.com left intact
Traceback (most recent call last):
  File "c:\python27\lib\site-packages\transfer_dialogs-0.28-py2.7.egg\transfer_dialogs\transfer_dialogs.py", line 64, in perform_transfer
    self.curl.perform()
error: (26, 'failed creating formpost data')

更新 2:

リクエストに応じて、もう少しデータを。filename には、開いているダイアログからの GetValue() の結果が含まれます。
logging.debug("ファイル名: %r エンコードされたファイル名: %r" % (ファイル名, filename.encode('UTF-8')))
結果:
2011 年 2 月 5 日土曜日 03:33:56 core.dialogs.upload_audio DEBUG:ファイル名: u'C:\Users\Q\test\\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u043f\u0430\u043f\u043a\u0430\test.mp3' エンコードされたファイル名: 'C: \Users\Q\test\\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x8f\xd0\xbf\xd0\xb0\xd0\ xbf\xd0\xba\xd0\xb0\test.mp3'

4

2 に答える 2

0

ファイル名は UTF-8 である必要があり、アップロード先のホストは UTF-8 ファイル名をサポートしている必要があります。別の非 Unicode エンコーディングをサポートしている場合は、ファイル名 KOI8-R または WIN1251 をエンコードしてみてください (もちろん、これは適切ではなく、標準に準拠していません)。

EDIT、コメントを見て:おそらくそれはだったはず ur"C:\Users\Q\test\Тестовая папка\test.mp3".encode("UTF-8")です。それはu少し重要です。それがない場合、キリル文字はコンソールのエンコーディングでエンコードされます。私はそれを試してみましたが、うまくいきました(アップロードではなく、ただsetopt)。

于 2011-02-04T22:58:33.550 に答える
0

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

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

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

1 の場合、sys.getfilesystemencoding()Unicode ファイル名 (Python コード全体で正しく使用されます) を、pycurl/libcurl が で正しく開くことができる文字列に変換するために使用しますfopen()strace(linux) または同等の Windows osxを使用して、正しいファイル パスが pycurl によって開かれていることを確認します。

それが完全に失敗した場合は、いつでも を介して Python からファイル データ ストリームをフィードできますpycurl.READFUNCTION

2 については、ファイルのアップロード中にファイル名がどのように送信されるかを学びます () 。たとえば、非常に長いファイル名に関しては、それが些細なことではないことはわかっていますが、良いリンクはありません。

于 2013-06-09T12:20:03.647 に答える