Расположение содержимого заголовка ответа HTTP для вложений - PullRequest
20 голосов
/ 12 марта 2011

Фон

Запишите XML-документ в поток ответов браузера и заставьте браузер отобразить диалоговое окно «Сохранить как».

Проблема

Рассмотрите следующее download() method:

  HttpServletResponse response = getResponse();

  BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(
      response.getOutputStream() ) );

  String filename = "domain.xml";
  String mimeType = new MimetypesFileTypeMap().getContentType( filename );

  // Prints "application/octet-stream"
  System.out.println( "mimeType: " + mimeType );

  // response.setContentType( "text/xml;charset=UTF-8" );
  response.setContentType( mimeType );
  response.setHeader( "Content-Disposition", "attachment;filename="
      + filename );

  bw.write( getDomainDocument() );
  bw.flush();
  bw.close();

В Firefox содержимое XML отображается в окне браузера.В IE 7 содержимое XML не отображается - вам необходимо просмотреть источник документа.Ни одна из ситуаций не является желаемым результатом.

Веб-страница использует следующий код для кнопки:

    <a4j:commandButton action="#{domainContent.download}" value="Create Domain" reRender="error" />

Сгенерированный XML не начинается с <?xml version="1.0"?> скорее содержимое XML напоминает:

<schema xmlns="http://www.jaspersoft.com/2007/SL/XMLSchema" version="1.0">
  <items>
    <item description="EDT Class Code" descriptionId="" label="EDT Class Code" labelId="" resourceId="as_pay_payrolldeduction.edtclass"/>
  </items>
  <resources>
    <jdbcTable datasourceId="JNDI" id="as_pay_payrolldeduction" tableName="as_pay.payrolldeduction">
      <fieldList>
        <field id="payamount" type="java.math.BigDecimal"/>
      </fieldList>
    </jdbcTable>
  </resources>
</schema>

Обновление № 1

Обратите внимание на следующую строку кода:

response.setHeader( "Content-Disposition", "attachment;filename=" + filename );

Обновление № 2

Использование <a4j:commandButton ... /> является проблемой;обычный <h:commandButton .../> работает как положено.Использование <h:commandBUtton .../> не позволяет <a4j:outputPanel .../> обновлять любые сообщения об ошибках.

Related Сообщение о шве .

Mime Type

Следующие типы пантомимыне вызывать диалоговое окно «Сохранить как»:

  • "application/octet-stream"
  • "text/xml"
  • "text/plain"

Вопрос

Какие изменения приведут к тому, что a4j:commandButton вызовет диалоговое окно "Сохранить как", в результате чего пользователю будет предложено сохранить файл XML (как domain.xml)?

Спасибо.

Ответы [ 5 ]

11 голосов
/ 26 сентября 2012

не используйте inline;ни привязанность;просто используйте

response.setContentType("text/xml");
response.setHeader( "Content-Disposition", "filename=" + filename );

или

response.setHeader( "Content-Disposition", "filename=\"" + filename + "\"" );

или

response.setHeader( "Content-Disposition", "filename=\"" + 
  filename.substring(0, filename.lastIndexOf('.')) + "\"");
8 голосов
/ 12 марта 2011

Попробуйте изменить тип контента (тип мультимедиа) на application/x-download, а расположение контента на: attachment;filename=" + fileName;

response.setContentType("application/x-download");
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
7 голосов
/ 14 марта 2011

Проблемы

В коде есть следующие проблемы:

  • Ajax-вызов (<a4j:commandButton .../>) не работает с вложениями.
  • Создание выходного содержимогодолжен произойти первым.
  • При отображении сообщений об ошибках также нельзя использовать теги a4j на основе Ajax.

Решение

  1. Изменить <a4j:commandButton .../> на <h:commandButton .../>.
  2. Обновить исходный код:
    1. Изменить bw.write( getDomainDocument() ); на bw.write( document );.
    2. Добавить String document = getDomainDocument(); в первую строку try/catch.
  3. Измените <a4j:outputPanel.../> (не показан) на <h:messages showDetail="false"/>.

По сути, удалите все средства Ajax, связанные с commandButton.По-прежнему возможно отображать сообщения об ошибках и использовать стиль пользовательского интерфейса RichFaces.

Ссылки

0 голосов
/ 12 марта 2011

Это не имеет ничего общего с типом MIME, но с заголовком Content-Disposition, который должен выглядеть примерно так:

Content-Disposition: attachment; filename=genome.jpeg;

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

0 голосов
/ 12 марта 2011

Попробуйте заголовок Content-Disposition

Content-Disposition: attachment; filename=<file name.ext> 
...