Содержимое содержимого заголовка 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
)?
Спасибо.
Ответы
Ответ 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;
Убедитесь, что он действительно правильно передан клиенту (не фильтруется сервером, прокси-сервером или чем-то еще). Также вы можете попытаться изменить порядок написания заголовков и установить их перед получением выходного потока.