Content-disposition игнорируется в IE 9 и Firefox 13

Я пытаюсь динамически создать встроенный PDF-файл, который, когда пользователь решит сохранить его, запрашивает мое собственное имя файла. Согласно документации, атрибут saveasname должен выполнять что я хочу.

(только format="PDF") Имя файла, которое появляется в диалоговом окне "Сохранить как", когда пользователь сохраняет файл PDF, записанный в браузере.

Однако как в IE 9, так и в Firefox 13.0.1 происходит то, что имя файла, отображаемое в диалоговом окне «Сохранить как», совпадает с моим шаблоном CF, но с расширением PDF. (Другими словами, мой код находится в makepdf.cfm, а SaveAs предлагает мне сохранить makepdf.pdf.) Однако в Chrome он работает отлично. (Все на Windows 7.)

Вот мой код для создания PDF:

<cfdocument format="pdf" bookmark="true" saveasname="MyReport.pdf">

Если я явно объявлю расположение контента и тип контента, например

<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf">
<cfcontent type="application/x-pdf">
<cfdocument format="pdf" bookmark="true" saveasname="MyReport.pdf">
  • Chrome сообщает мне, что «Content-Disposition» был объявлен дважды
  • Firefox сообщает мне, что файл PDF поврежден
  • IE просто игнорирует его (и по-прежнему не показывает правильное имя файла)

Если я просто полагаюсь на заголовок

<cfheader name="Content-Disposition" value="inline; filename=MyReport.pdf">
<cfcontent type="application/x-pdf">
<cfdocument format="pdf" bookmark="true">

Я получаю то же поведение, что и первый фрагмент кода.

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

Мне нужно использовать время и дату в именах файлов, а конечные пользователи недостаточно сообразительны, чтобы не перезаписывать свои файлы (если они захотят их сохранить).

Есть ли что-то, что я упускаю, что заставит IE и Firefox делать то, что они должны делать? Какие другие браузеры будут делать это? Мобильное сафари?


person ale    schedule 18.07.2012    source источник


Ответы (3)


Проблема, похоже, заключается в том, что «имя файла = xxx» действительно предназначалось для расположения «вложения», и не все плагины PDF для браузера распознают его как механизм для указания встроенного «сохранить как», как вы обнаружили.

Другой подход к тому, чтобы заставить их все использовать предпочитаемое вами имя файла, заключается в манипулировании URL-адресом с использованием правил перезаписи веб-сервера. В качестве простого примера у вас будет скрипт для создания PDF-файлов и их встроенного использования: pdf.cfm.

<cfheader name="Content-Disposition" value="inline">
<cfdocument format="PDF" mimetype="application/pdf">Test</cfdocument>

Затем создайте правило перезаписи, которое сопоставляет URL-адреса в форме /pdf/myfilename и передает их в pdf.cfm. В IIS7 это может быть:

<rule name="Inline PDF SaveAs" stopProcessing="true">
    <match url="^/pdf/[\w-]+$" ignoreCase="true" />
    <action type="Rewrite" url="/pdf.cfm" appendQueryString="false" />
</rule>

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

При доступе к /pdf/myreport PDF-файл будет отображаться встроенным плагином, а при его сохранении имя файла по умолчанию будет myreport.pdf.

Если вы используете фреймворк, который поддерживает безопасные URL-адреса или «маршруты» для поисковых систем, вы можете сделать то же самое без перезаписи веб-сервера.

ОБНОВЛЕНИЕ: на самом деле вам не нужно использовать перезапись URL-адресов: просто добавьте косую черту, а затем нужное имя файла к URL-адресу сценария CF, например.

/pdf.cfm/myreport

Плагин будет использовать все, что идет после последней косой черты, в качестве имени «Сохранить как…».

person CfSimplicity    schedule 23.07.2012
comment
Перезапись URL не подходит для этого конкретного проекта, но это полезная информация на будущее. - person ale; 23.07.2012
comment
Оказывается, вам не нужно перезаписывать URL-адрес — достаточно просто добавить косую черту и выбранное вами имя файла к URL-адресу скрипта. Смотрите обновленный ответ. - person CfSimplicity; 24.07.2012

Убедитесь, что вы используете ATTACHMENT, а не INLINE.

IE НЕ любит INLINE и открывает текстовый документ ТОЛЬКО ДЛЯ ЧТЕНИЯ, а также не принимает имя файла, которое вы ему даете.

Пример:

<cfheader name="content-disposition" value="attachment; filename=#filename#.doc" charset="utf-8">

НЕТ

<cfheader name="content-disposition" value="inline; filename=#filename#.doc" charset="utf-8">
person webpointz    schedule 19.03.2014

Я бы использовал атрибут name тега cfdocument, который будет хранить содержимое в переменной. Затем используйте теги cfheader и cfcontent, как указано выше, за исключением замены «inline;» с «приложением»;

Я использую такой код:

<cfdocument name="pdf"> ... </cfdocument>
<cfheader name="Content-Disposition" value="attachment;filename=MyReport.pdf;" />
<cfcontent type="application/pdf" variable="#pdf#" />
person Sean Coyne    schedule 20.07.2012