Загрузка файлов из кириллического пути с помощью pycurl - PullRequest
1 голос
/ 05 февраля 2011

Я недавно разработал диалоговое окно загрузки, поддерживаемое PyCURL, которое я использую в нескольких своих приложениях.
Я столкнулся с проблемой при настройке опции HTTPPOST в pycurl.Я устанавливаю это так:
self.curl.setopt (self.curl.HTTPPOST, [(field, (self.curl.FORM_FILE, filename))]))) 1003 * Если 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'))))
результат:
Сб 05 февраля 2011 г. 03:33:56 core.dialogs.upload_audio ОТЛАДКА: Имя файла: u'C: \ Users \ Q \ test \\ u0422 \ u0435 \ u0441 \ u0442 \ u043e \ u0432 \ u0430\ u044f \ u030f \ u0430 \ u043f \ 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 голосов
/ 09 июня 2013

Разобрать эту проблему на 2 компонента:

  1. указать pycurl, какой файл открыть для чтения данных файла
  2. отправить имя файла в правильной кодировке на сервер

Это могут быть или не совпадать кодировки.

Для 1 используйте sys.getfilesystemencoding(), чтобы преобразовать имя файла Unicode (которое вы используете в коде Python правильно) в строку, которую pycurl / libcurl может правильно открыть с помощью fopen().Используйте strace (linux) или эквивалент windows osx , чтобы убедиться, что pycurl открывает правильный путь к файлу.

Если это не помогло, вы всегда можете передать данные файлапоток из Python через pycurl.READFUNCTION.

Для 2, узнайте, как имя файла передается при загрузке файла, пример .У меня нет хорошей ссылки, все, что я знаю, это не тривиально, например, когда дело доходит до очень длинных имен файлов.

0 голосов
/ 05 февраля 2011

Имя файла должно быть в UTF-8, и хост, на который вы загружаете его, должен поддерживать имена файлов UTF-8.Если он поддерживает другую кодировку, отличную от Unicode, попробуйте закодировать имя файла KOI8-R или WIN1251 (но это, конечно, нехорошо и соответствует стандартам).

EDIT , увидев комментарии: Вероятно, это должно было быть ur"C:\Users\Q\test\Тестовая папка\test.mp3".encode("UTF-8").Это u немного важно;без него буквы кириллицы берутся закодированными в вашей кодировке консоли.Я просто попробовал, и это сработало (не загружать, просто setopt).

...