Найти - Пользователи
Полная версия: Никак не получается динамический download файлов.
Начало » Django » Никак не получается динамический download файлов.
1
Andrejus
Есть вью:
def serve_file(request):
f = file(settings.MEDIA_ROOT + 'task/test.docx')
data = FileWrapper(f)
response = HttpResponse(data, mimetype="application/msword; charset=windows-1251")
response['Content-Disposition'] = 'attachment; filename=uuu.docx'
return response
Кодировка в программном модуле - UTF-8.
Файл - документ из одной строчки на английском (для простоты).
В результате браузер предлагает открыть (как Word) или сохранить. При открытии ругается , “не удаётся открыть файл … из-за ошибок содержимого”. Путь в порядке, проверял.
Запутался в трёх соснах.
Doberman26rus
Попробуй так:
f = file(settings.MEDIA_ROOT + 'task/test.docx', 'r+')
response = HttpResponse(data, content_type="application/msword")
Andrejus
Doberman26rus
Попробуй так:
f = file(settings.MEDIA_ROOT + 'task/test.docx', 'r+')
response = HttpResponse(data, content_type="application/msword")
Увы, не помогло - всё равно приходит та же ошибка.

Дам доп инфу: Винда 7 x64, питон 2.7.1 и джанга 1.2.5 - 32 бита, Word 2007 32 бита…
Doberman26rus
упс. Простите не заметил =)
не
f = file(settings.MEDIA_ROOT + 'task/test.docx', 'r+')
а
f = open(settings.MEDIA_ROOT + 'task/test.docx', 'r+')
Andrejus
Doberman26rus
упс. Простите не заметил =)
не
f = file(settings.MEDIA_ROOT + 'task/test.docx', 'r+')
а
f = open(settings.MEDIA_ROOT + 'task/test.docx', 'r+')
Вылезла та же ошибка. Погуглив выяснил, что, похоже, для DOCX-файлов существует новый мим-тип “application/vnd.openxmlformats-officedocument.wordprocessingml.document”, который вроде как надо регистрировать на серваках, но это другая тема.

Решил попробовать скормить файл word, сохранённый в формате 97-2003 - получилось так:
def serve_file(request):
f = open(settings.MEDIA_ROOT + 'task/test.doc', 'r+')
data = FileWrapper(f)
response = HttpResponse(data, content_type="application/msword")
response['Content-Disposition'] = 'attachment; filename=uuu.doc'
return response
Перезапустил на всякий случай джанго-сервер, пошёл по ссылке, и получил в ворде диалог выбора кодировки. При этом ворд предложил мне кодировку “Вьетнамская(Windows)”, выбор иных кодировок не дал результатов, открылся документ из символов псевдографики - вместо одной строки исходного текста получил много строк непонятных значков :).
Александр Кошелев
Может быть файл всё-таки в бинарном режиме открыть?
Andrejus
Гениально!
Добавление ‘b’ к режиму открытия решило все вышеописанные проблемы.
Спасибо всем, особенно Александру.

ЗЫ: однако для .docx лучше использовать mime-type “application/vnd.openxmlformats-officedocument.wordprocessingml.document”, иначе к имени файла будет присовокуплён хвост с расширением .DOC.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB