2011-02-04 7 views
1

최근 몇 가지 내 응용 프로그램에서 사용하고있는 PyCURL 기반의 업로드 대화 상자를 설계했습니다.
pycurl의 HTTPPOST 옵션을 설정할 때 문제가 발생했습니다. 나는 이렇게 설정하고있다.
self.curl.setopt (self.curl.HTTPPOST, [(field, (self.curl.FORM_FILE, filename))])
filename이 문자열이면 모두 정상이다. 그러나 유니 코드를 전달하면 TypeError가 발생합니다. 내가 키릴 문자 경로를 줄 수있는 방법이 있습니까? UTF-8 인코딩을 시도했지만 실패했습니다. 는 시간 내 주셔서 감사pycurl을 사용하여 키릴 문자 경로에서 파일 업로드

업데이트 :

내가 실제로 WX 컨트롤에서 파일 이름을 받고 있어요, 그래서도 만지지 전에 유니 코드입니다. 그때 UTF-8로 인코딩 할 때, 수행 (('UTF-8') = filename.encode을 파일 이름을 사용) 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일 3시 33분 56초 코어 .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 '

+0

"UTF-8 인코딩을 시도했지만 실패했습니다."- 시도한 방법과 결과는 무엇입니까? 횡설수설, 예외 (역 추적이 도움이됩니다), 기타). 또한 : "키릴 문자 경로"는 무엇입니까 ?? 예를 들어에 인코딩 된 파일 이름/경로 cp1251? 어떤 운영 체제를 사용하고 있습니까? –

+0

filename = filename.encode ('UTF-8')로 시도했습니다. HTTPPOST 옵션을 설정 한 행에서 다음을 발생시킵니다. error : (26, 'formpost 데이터 작성 실패') OS Windows. 경로는 다음과 같습니다 : r "C : \ Users \ Q \ test \ Тестовая папка \ test.mp3" –

+0

'something_like (filename)'대신에'repr()'을 사용하여 유니 코드 파일의 이름을 명확하게 표시하십시오 wx 컨트롤에서. –

답변

0

파일 이름은 UTF-8 파일 이름을 지원해야하는 업로드 UTF-8, 호스트에 있어야합니다. Unicode가 아닌 다른 인코딩을 지원하는 경우 KOI8-R 또는 WIN1251이라는 파일 이름을 인코딩하십시오 (물론 이것은 훌륭하고 표준을 따르지 않습니다).

EDIT 주석을 본 사람 : 아마 ur"C:\Users\Q\test\Тестовая папка\test.mp3".encode("UTF-8")이어야합니다. 그 u 비트 중요; 그것 없이는 키릴 문자가 콘솔 인코딩으로 인코딩됩니다. 나는 그것을 시험해 보았다. 그리고 그것은 효과가 있었다 (업로드가 아니라 단지 setopt).

+0

파일 이름을 UTF-8로 인코딩하면 다음과 같은 메시지가 나타납니다. 오류 : (26, 'formpost 데이터 생성 실패') HTTPPOST 행. –

0

2 개 구성 요소로이 문제를 분해 : 서버

에 올바른 인코딩에

  • 전송 파일 이름 파일 데이터를 읽기 위해 열 파일

    1. TELL의 pycurl 이들은 또는하지 않을 수 있습니다 동일한 인코딩.

      1의 경우, 파이썬 코드에서 올바르게 사용하는 유니 코드 파일 이름을 fopen()으로 올바르게 열 수있는 문자열로 변환하려면 sys.getfilesystemencoding()을 사용하십시오. pycurl에 의해 올바른 파일 경로가 열려 있는지 확인하려면 strace (linux) 또는 이와 동등한 windowsosx을 사용하십시오.

      완전히 실패하면 pycurl.READFUNCTION을 통해 파이썬의 파일 데이터 스트림을 피드 할 수 있습니다.

      2의 경우 파일 업로드 중에 파일 이름이 어떻게 전송되는지 알아보십시오. example 좋은 링크가 없으므로 사소한 것이 아니라는 것을 알고 있습니다. 매우 긴 파일 이름에 관해서.

  • 관련 문제