ссылка на скачивание не работает в IE

Я пытался внедрить «ссылку для скачивания» и поместить ее рядом с одной из моих таблиц отчетов, чтобы пользователи могли загружать CSV-файл и открывать его в таких приложениях, как Excel.

Записи генерируются динамически на основе запросов, сделанных пользователями.

Итак, где-то в моем контроллере есть что-то вроде:

response.headers['Content-Type'] = 'text/csv'
response.headers['Content-Disposition'] = 'attachment; filename=xxx.csv'
return response.stream(dynamically_generated_csv, request=request)

Это работает как в FireFox, так и в Chrome, но не работает в IE.

Когда я распечатал заголовки ответов, я обнаружил, что web2py добавил к моему ответу несколько заголовков: «Expires», «Cache-Control» и т. д.

И когда я удаляю заголовок «Cache-Control», выполнив следующие действия:

del response.headers['Cache-Control']

В ИЕ работает.

Таким образом, похоже, что у IE возникают проблемы с загружаемым файлом с установленным значением «Cache-Control».

Теперь мой вопрос:

  • Почему web2py неявно добавляет эти заголовки ответов? а может без способа его отключить?

  • есть ли какой-либо побочный эффект, когда я удаляю заголовок «Cache-Control» таким образом?

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


person satoru    schedule 04.01.2010    source источник
comment
Это известный дефект в некоторых версиях IE: support.microsoft.com/kb/323308.   -  person Adam Crossland    schedule 04.01.2010
comment
Когда я использовал Django, заголовки ответов — это только те, которые я установил явно; однако в случае с web2py он добавил заголовки ответов без ведома разработчиков, поэтому я думаю, что, возможно, это не очень хороший дизайн для фреймворка, людям потребовалось время, чтобы выяснить, что происходит под капотом.   -  person satoru    schedule 04.01.2010
comment
При обслуживании статических файлов web2py устанавливает заголовки кеша, чтобы убедиться, что ваш браузер не запрашивает файлы, которые у него уже есть и которые не были изменены на сервере. При обслуживании динамического контента web2py следит за тем, чтобы браузер не кэшировал его (думаю, это ваш случай). Философия web2py отличается от философии других фреймворков. Он пытается сделать для вас как можно больше, чтобы вам не приходилось учиться (в данном случае, как управлять кешем браузера). Как было указано, проблема заключается в ошибке IE. Я внесу это в список рассылки web2py и обсужу с другими разработчиками.   -  person mdipierro    schedule 04.01.2010
comment
Я думаю, что это эссе может помочь избежать этой ошибки IE: joseph.randomnetworks.com/archives/2004/10/01/   -  person satoru    schedule 04.01.2010
comment
Интересный. Предлагаемое решение (обратная ошибка IE) состоит в замене заголовков ['Cache-Control'] = 'private' заголовками ['Cache-Control'] = 'public'. Если мы сделаем это, прокси-серверы могут решить кэшировать страницы, что может привести к поломке какого-либо динамического приложения. Изменение кеша с частного по умолчанию на общедоступный по умолчанию также имеет последствия для безопасности. Во всяком случае, посмотрю на это больше. Спасибо.   -  person mdipierro    schedule 04.01.2010
comment
Каков ПОЛНЫЙ набор заголовков, которые возвращаются в этом ответе?   -  person EricLaw    schedule 07.01.2010


Ответы (3)


Я не уверен, какие заголовки управления кешем отправляются/отправлялись, но в IE есть ошибка с загруженными файлами, как у вас.

Для IE НЕОБХОДИМО включить кэширование. Когда IE загружает файлы (например, файлы Excel), в Excel они загружаются из каталога кеша, поэтому, если вы не кэшируете его, Excel (или другое ваше приложение) не сможет загрузить файл.

Эрик Лоу (MSFT) по теме: http://blogs.msdn.com/ieinternals/archive/2009/10/02/Internet-Explorer-cannot-download-over-HTTPS-when-no-cache.aspx

Обновить: если вы просто хотите принудительно загрузить... например. IE не загружает файл excel в окно IE... тогда обязательно установите полные заголовки для вложения.

//PHP style
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="downloaded.pdf"');
person scunliffe    schedule 04.01.2010
comment
Спасибо за ваше объяснение. Но я думаю, что это может быть не та проблема, с которой я столкнулся. Я явно установил «Content-Disposition» на «attachment», и я думаю, что это, надеюсь, предотвратит открытие файла даже в IE. - person satoru; 04.01.2010
comment
Еще более проблематичным, чем заголовки управления кешем, как упоминалось в записи блога Эрика, является тот факт, что заботящиеся о безопасности люди любят включать параметр Internet Explorer Do not save encrypted pages to disk, который не ограничивается кэшированием, но полностью предотвращает сохранение любой файл с сайтов с поддержкой SSL на диск. Неисправен по дизайну. - person Arc; 13.04.2011
comment
Сатору - сработало ли изменение содержания-диспозиции? Я испытываю ту же проблему в данный момент. - person MM.; 20.06.2011

Использует ли ссылка для скачивания https (ssl)? Если это так, то IE не может обрабатывать загрузку, если она настроена на кэширование. Это известная проблема с IE.

person kosoant    schedule 04.01.2010

Это не отвечает на ваш вопрос, но решает, надеюсь, исходную проблему.

Я бы просто добавил метку времени (что-то достаточно уникальное) для запроса строки ссылки на файл CSV. Это помогло мне.

person Grzegorz Gierlik    schedule 04.01.2010