Django: имена файлов Unicode с заголовками ASCII? - PullRequest
3 голосов
/ 28 апреля 2010

У меня есть список странно закодированных файлов: 02 - Charlie, Woody and You/Study #22.mp3, который, я полагаю, не так уж и плох, но есть несколько конкретных символов, которые Django ИЛИ nginx, кажется, цепляют.

>>> test = u'02 - Charlie, Woody and You/Study #22.mp3'
>>> test
u'02 - Charlie, Woody and You\uff0fStudy #22.mp3'

Я использую nginx в качестве обратного прокси-сервера для подключения к встроенному веб-серверу django (все еще в стадии разработки) и postgresql для моей базы данных. Моя база данных и все таблицы en_US.UTF-8, и я использую pgadmin3 для просмотра своих таблиц вне django. Моя проблема выходит за рамки моего названия, во-первых, как мне сохранить, возможно, странные имена файлов в моей базе данных? Мой текущий метод

'path': smart_unicode(path.lstrip(MUSIC_PATH)),
'filename': smart_unicode(file)

и когда я распечатываю значения, которые они показывают, u'whateverthecrap'

Я не уверен, должен ли я так поступать, но, если предположить, что сейчас у меня проблемы с попыткой выложить загрузку.

Мой вид загрузки выглядит примерно так:

def song_download(request, song_id):
    song = get_object_or_404(Song, pk=song_id)
    url = u'/static_music/%s/%s' % (song.path, song.filename)

    print url

    response = HttpResponse()
    response['X-Accel-Redirect'] = url
    response['Content-Type'] = 'audio/mpeg'
    response['Content-Disposition'] = "attachment; filename=test.mp3"

    return response

и большинство файлов будут загружены, но когда я доберусь до 02 - Charlie, Woody and You/Study #22.mp3, я получаю это от django: 'ascii' codec can't encode character u'\uff0f' in position 118: ordinal not in range(128), HTTP response headers must be in US-ASCII format.

Как я могу использовать ASCII-приемлемую строку, если мое имя файла выходит за пределы? 02 - Charlie, Woody and You\uff0fStudy #22.mp3 не похоже на работу ...

РЕДАКТИРОВАТЬ 1

Я использую Ubuntu для своей ОС.

1 Ответ

7 голосов
/ 30 апреля 2010

Хотя является необычным и нежелательным символом, ваш сценарий сломается для любого не-ASCII символа.

response['X-Accel-Redirect'] = url

url - это Unicode (и это не URL, это путь к файлу). Заголовки ответа являются байтами. Вам нужно будет закодировать его.

response['X-Accel-Redirect'] = url.encode('utf-8')

это предполагает, что вы работаете на сервере с UTF-8 в качестве кодировки файловой системы.

(Теперь, как закодировать имя файла в заголовке Content-Disposition ... это очень сложный вопрос!)

...