LINUX.ORG.RU

Отдача файлов и имя файла в utf8

 , , ,


0

1

Сервер на TornadoWeb, но думаю, что тут принципиальной разницы нет.

Как отдать имя файла, если оно в utf8?

К примеру, есть файл «тест.png», я его читаю и отдаю клиенту, устанавливая заголовки ответа:

        self.set_header('Content-Type', 'application/octet-stream')
        self.set_header('Content-Disposition', 'attachment; filename=%s' % filename)

И получаю ошибку:

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 42-43: ordinal not in range(256)

Попытался его заэскейпить:

        self.set_header('Content-Type', 'application/octet-stream')
        self.set_header('Content-Disposition', 'attachment; filename=%s' % tornado.escape.utf8(filename))

Ошибки нет, но имя нечитабельно в браузере:

Content-Disposition:attachment; filename=b'\xd0\xbd\xd0\xb0_\xd0\xb4\xd0\xbe\xd0.png'

И как быть? Вообще возможно, что я хочу?

★★★★★

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

Попробуй что-то вроде:

self.set_header('Content-Disposition', u'attachment; filename=%s' % filename)

u намекает что строка в юникоде.

Hater ★★
()
'attachment; filename="stub_filename"; filename*=UTF-8\'\'{}'.format(quote(filename.encode('utf-8'))))

Как-то так будет чуть кроссбраузернее.

http://stackoverflow.com/a/6745788/2815355 тут о разнице между filename и filename* и том, какие браузеры что ожидают.

x3al ★★★★★
()
Последнее исправление: x3al (всего исправлений: 1)
Ответ на: комментарий от Hater

не проверял еще. но нагуглил отсюда и отсюда

что нужно вот так:

self.set_header('Content-Disposition', "attachment; filename*= UTF-8''%s" % tornado.escape.url_escape(filename))

Работает, как надо.

bvn13 ★★★★★
() автор топика
Последнее исправление: bvn13 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.