Подтвердить что ты не робот

Содержимое содержимого заголовка HTTP-ответа для вложений

Фон

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

Проблема

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

  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 .../> обновлять сообщения об ошибках.

Связанный Сообщение шва.

Тип Mime

Следующие типы mime не запускают диалог "Сохранить как" :

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

Вопрос

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

Спасибо.

4b9b3361

Ответ 1

Проблемы

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

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

Решение

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

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

Ссылки

Ответ 2

не использовать 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('.')) + "\"");

Ответ 3

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

response.setContentType("application/x-download");
response.setHeader("Content-disposition", "attachment; filename=" + fileName);

Ответ 4

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

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

Ответ 5

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

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

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