使用pycurl从西里尔语路径上载文件

时间:2011-02-04 22:17:55

标签: python unicode pycurl

我最近设计了一个由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,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'

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

  1. 告诉pycurl打开哪个文件来读取文件数据
  2. 以正确的编码将文件名发送到服务器
  3. 这些可能是也可能不是相同的编码。

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

    如果完全失败,您始终可以通过pycurl.READFUNCTION从Python提供文件数据流。

    对于2,了解文件上传过程中文件名的传输方式example。我没有一个很好的联系,我所知道的并不是微不足道的,例如当谈到很长的文件名时。