2014-11-23 2 views
0

Я работаю над webapp с помощью Turbogears 2.3.3
В моем приложении пользователи получат набор направлений, и им нужно будет загрузить некоторые файлы соответственно.
Важно, чтобы они могли загружать файлы с их оригинальным именем, которое будет в utf8. Вот мой метод для загрузки файлов: Ответ Turbogears - отправка utf-8 filename

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']))) 

Я получаю сообщение об ошибке, если квт [ «имя файла»] в UTF-8, что большинство моих файлов будет. Есть ли способ иметь исходные имена файлов?

Спасибо за помощь

ответ

1

К сожалению, вы столкнулись с одним из многих темных углов в WSGI и HTTP. Как указано в спецификации WSGI:

Заметим также, что строки, передаваемые start_response() как состояние или как заголовки ответа должны следовать RFC 2616 относительно кодирования. То, что есть, они должны быть либо символами ISO-8859-1, либо использовать кодировку RFC 2047 MIME .

Это означает, что ваши заголовки должны быть закодированы как latin-1 или с использованием RFC2047, проблема в том, что, как браузеры не ведут себя надежным образом, поддержка заголовков внешних Latin-1 была оставлена ​​из WebOb до сих пор (см https://github.com/Pylons/webob/issues/11#issuecomment-2819811).

Лучшее решение, вероятно, вручную кодировать Content-Disposition заголовок с помощью RFC6266, который обеспечивает filename* для кодирования Юникода с помощью percentage encoding. Это обеспечит результат, полностью совместимый с латинским-1, делая WSGI счастливым и может представлять символы Unicode UTF8.

Вот краткий пример, который дает «ставки EURO» и «€» ставки в зависимости от браузеров:

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?

Смежные вопросы