2012-03-02 4 views
3

Я хочу загрузить файл с помощью метода Django 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».Загрузка файла с китайскими иероглифами в имени в Django с HttpResponse

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

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

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

Edit:

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

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

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

+1

Пробовал ли вы без вызова urlquote? – jpic

+0

yes, но без urlquote, unicode error покажет – Angelia

+0

Вы должны заменить вложение «вложение», я думаю ... также попробуйте force_unicode вместо urlquote (из django.utils.encoding import force_unicode) – jpic

ответ

2

Я думаю, что это может иметь что-то делать с Encoding Translated Strings

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

from django.utils.encoding import smart_str, smart_unicode 
    response['Content-Disposition'] = 'attachment; filename=%s' % smart_str(filename) 
    return response 
+0

Да, это работает, спасибо! – Angelia

1

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

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 
+1

Вы говорите: «Следующий код работает для меня, чтобы решить вашу проблему»? Если да, можете ли вы объяснить, как OP может применить его к своей проблеме? – sgress454

0

Благодаря bronze man и Kronel, я пришел к приемлемому решению этой проблемы:

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> 

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

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

  • Нет связанных вопросов^_^