1

我最近设计了一个由 PyCURL 支持的上传对话框,我在一些应用程序中使用了它。
我在设置 pycurl 的 HTTPPOST 选项时遇到了问题。我这样设置它:
self.curl.setopt(self.curl.HTTPPOST, [(field, (self.curl.FORM_FILE, 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:

根据要求,更多数据。文件名包含打开对话框中 GetValue() 的结果。
logging.debug("文件名:%r 编码文件名:%r" % (filename, filename.encode('UTF-8')))
结果:
2011 年 2 月 5 日星期六 03:33:56 core.dialogs.upload_audio 调试:文件名: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

将此问题分解为 2 个组件:

  1. 告诉pycurl打开哪个文件来读取文件数据
  2. 将正确编码的文件名发送到服务器

这些可能是也可能不是相同的编码。

对于 1,用于sys.getfilesystemencoding()将 unicode 文件名(您在整个 python 代码中正确使用)转换为 pycurl/libcurl 可以正确打开的字符串fopen()。使用strace(linux) 或等效的的windows osx来验证 pycurl 正在打开正确的文件路径。

如果这完全失败,您始终可以通过pycurl.READFUNCTION.

2、了解文件上传过程中文件名是如何传输的,例子。我没有一个好的链接,我只知道这不是微不足道的,例如当涉及到非常长的文件名时。

于 2013-06-09T12:20:03.647 回答
0

文件名应为 UTF-8 格式,并且您上传到的主机应支持 UTF-8 文件名。如果它支持不同的非 Unicode 编码,请尝试对文件名 KOI8-R 或 WIN1251 进行编码(但这当然不好且不符合标准)。

编辑,看到评论:可能应该是 ur"C:\Users\Q\test\Тестовая папка\test.mp3".encode("UTF-8")。这u一点很重要;没有它,西里尔字母会在您的控制台编码中进行编码。我只是试了一下,它起作用了(不是上传,只是setopt)。

于 2011-02-04T22:58:33.550 回答