2014-11-23 3 views
0

나는 Turbogears 2.3.3을 사용하는 webapp에서 작업 중입니다.
내 앱에서 사용자는 길 찾기 집합을 얻고 이에 따라 일부 파일을 다운로드해야합니다.
파일 이름을 utf8로 다운로드 할 수 있어야합니다. 나는 그런 파일을 가져하려고 할 때, 파일 이름은 원본 파일의 확장자가 "다운로드" Turbogears 응답 - utf-8 파일 이름 전송

import os 
from webob.static import FileApp 
from tg import expose, request, use_wsgi_app, response 

.... 

@expose() 
def download(self,**kw): 
    response.headerlist.append(('Content-Disposition','attachment')) 
    path_to_file = os.path.join(os.path.dirname(dfuswebapp.__file__), 'PrintFiles') 
    file_with_path = os.path.join(path_to_file,kw['filename']) 
    file = FileApp(file_with_path) 
    return use_wsgi_app(file) 

입니다 : 다음은 파일 다운로드를위한 나의 방법이다. 이 코드하려고하면

는 :

response.headerlist.append(('Content-Disposition','attachment;filename=%s'%str(kw['filename']))) 

을 kw의 [ '파일 이름'] UTF-8, 내 파일의 대부분이 될 것 인 경우 오류가 발생합니다. 원본 파일 이름이있는 방법이 있습니까?

도움을 주셔서 감사합니다.

답변

1

슬프게도 WSGI 및 HTTP의 많은 어두운 구석 중 하나에 직면했습니다. WSGI 스펙 바와 같이 상태이나 응답 헤더로서 start_response 전달 문자열() 부호화에 대하여 RFC 2616를 수행해야하는 것도

참고. 은 ISO-8859-1 문자이거나 RFC 2047 MIME 인코딩을 사용해야합니다.

이 헤더 latin-1 또는 RFC2047 사용으로 인코딩해야 의미, 문제가 브라우저가 신뢰할 수있는 방식으로 행동하지 않는 한, 라틴-1 외부 헤더에 대한 지원이 지금까지 webob에서 제외 된 것입니다 (참조 https://github.com/Pylons/webob/issues/11#issuecomment-2819811).

베스트 솔루션 수동 유니 인코딩 percentage encoding을 이용해 filename* 제공 RFC6266를 사용 Content-Disposition 헤더를 인코딩 아마도. 그러면 완벽하게 latin-1을 준수하며 WSGI를 행복하게 만들고 Unicode UTF8 문자를 나타낼 수 있습니다.

Content-Disposition: attachment; 
          filename="EURO rates"; 
          filename*=utf-8''%e2%82%ac%20rates 

참조이 게시물에 StackOverflow에서이 문제에 관한 논의 : How to encode the filename parameter of Content-Disposition header in HTTP?

다음

는 "유로 속도 '와 브라우저에 따라 €"속도 "를 제공하는 간단한 예제입니다