Загрузка файла с китайскими иероглифами в имени в Django с помощью HttpResponse - PullRequest
3 голосов
/ 02 марта 2012

Я хочу скачать файл с помощью метода httpresponse Джанго.Название файла содержит несколько специальных символов, например, китайский.Я могу загрузить файл со следующим кодом, но имя файла отображается как «% E6% B8% B8% E6% 88% 8F% E6% B5% 8F% E8% A7% 88% E5% 99% A8% E6%B3% A8% E5% 86% 8C% E9% A1% B5% E9% 9D% A2.jpg ".

Может кто-нибудь сказать мне, как преобразовать имя файла?

response = HttpResponse(attachment.file, content_type='text/plain',mimetype='application/octet-stream')

response['Content-Disposition'] = "attachment; filename="+urlquote(filename)
return response

Редактировать :

Другая проблема возникает при использовании smart_str, имя файла может нормально отображаться в Firefox и Chrome, но не в IE: в IE по-прежнему отображаются некоторые неизвестные символы,Кто-нибудь знает, как решить эту проблему?

Заранее спасибо!

--- решено путем использования urlquote и smart_str по-разному в IE и других браузерах.

Ответы [ 4 ]

2 голосов
/ 09 октября 2015

Следующий код работает для меня, чтобы решить вашу проблему.

from django.utils.encoding import escape_uri_path

response = HttpResponse(attachment.file, content_type='text/plain',mimetype='application/octet-stream')

response['Content-Disposition'] = "attachment; filename*=utf-8''{}".format(escape_uri_path(filename))
return response
2 голосов
/ 02 марта 2012

Я думаю, что это как-то связано с Кодированием переведенных строк

Попробуйте это:

    from django.utils.encoding import smart_str, smart_unicode
    response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(filename)
    return response
0 голосов
/ 04 мая 2017

Благодаря бронзовому человеку и Кронелю я пришел к приемлемому решению этой проблемы:

urls.py:

url(r'^customfilename/(?P<filename>.+)$', views.customfilename, name="customfilename"),

views.py:

def customfilename(request, *args, filename=None, **kwds):
    ...
    response = HttpResponse(.....)
    response['Content-Type'] = 'your content type'
    return response

your_template.html (ссылки на представление, предоставляющее файл)

<a href="customfilename/{{ yourfancyfilename|urlencode }}.ext">link to your file</a>

Обратите внимание, что имя файла не обязательно должно быть параметром.Однако приведенный выше код сообщит вашей функции, что это такое.Полезно, если вы обрабатываете несколько разных типов контента в одной и той же функции.

0 голосов
/ 04 декабря 2014

Не существует совместимого способа кодирования не-ASCII-имен в Content-Disposition. Совместимость браузера - беспорядок.

/real_script.php/fake_filename.doc
/real_script.php/mot%C3%B6rhead   # motörhead

пожалуйста, посмотрите на https://stackoverflow.com/a/216777/1586797

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...