2011-02-04 49 views
1

我最近設計了一個由我在幾個應用程序中使用的PyCURL支持的上傳對話框。
我在設置pycurl的HTTPPOST選項時遇到了問題。我設置它是這樣的:
self.curl.setopt(self.curl.HTTPPOST,[(field,(self.curl.FORM_FILE,filename))]))
如果filename是一個字符串,則一切正常。如果我將它傳遞給unicode,它會引發TypeError。 有什麼辦法讓我能夠給它一個西里爾的路徑?我嘗試過使用UTF-8編碼,但沒有成功。 感謝您的時間使用pycurl從西里爾文路徑上傳文件

更新:

我真的開始從WX控制文件名,所以它的unicode之前,我甚至觸摸它。當我然後它編碼爲UTF-8,(使用文件名= 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(「Filename:%r encoded filename:%r」%(filename,filename.encode('UTF-8')))
結果:
Sat Feb 05,2011 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'

+0

「我嘗試過使用UTF-8編碼它,但那不成功」 - 解釋你如何嘗試,結果如何:亂碼,異常(回溯會有幫助),其他)。另外:什麼是「西里爾途徑」?文件名/路徑編碼在例如CP1251?您使用什麼操作系統? – 2011-02-04 23:41:27

+0

我試着用filename = filename.encode('UTF-8')。然後設置HTTPPOST選項的行:錯誤:(26,'創建表單數據'失敗)操作系統Windows。路徑如下:r「C:\ Users \ Q \ test \Тестоваяпапка\ test.mp3」 – 2011-02-05 00:48:49

回答

0

文件名應該是UTF-8,主機上傳它應該支持UTF-8的文件名。如果它支持不同的非Unicode編碼,請嘗試對文件名KOI8-R或WIN1251進行編碼(但這當然不好,符合標準)。

編輯,看到了評論:可能它應該是ur"C:\Users\Q\test\Тестовая папка\test.mp3".encode("UTF-8")。那u有點重要;沒有它,西里爾文字母就會被編碼爲您的控制檯編碼。我只是嘗試它,它的工作(不上傳,只是setopt)。

0

分解這個問題分成兩個部分組成:

  1. 告訴pycurl打開讀取文件中的數據在正確的編碼
  2. 發送文件名到服務器

的文件,這些可能會或可能不會相同的編碼。

對於1,請使用sys.getfilesystemencoding()將unicode文件名(您在整個python代碼中正確使用)轉換爲pycurl/libcurl可以正確打開的字符串,其格式爲fopen()。使用strace(linux)或等效的windowsosx來驗證pycurl正在打開正確的文件路徑。

如果完全失敗,您可以通過pycurl.READFUNCTION從Python提供文件數據流。

2,學習如何在文件上傳過程中傳輸文件名,example。我沒有一個很好的鏈接,我只知道它不是微不足道的,例如當涉及到非常長的文件名時。