web-dev-qa-db-ja.com

添付ファイルの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コンテンツは表示されません。ドキュメントソースを表示する必要があります。どちらの状況も望ましい結果ではありません。

Webページでは、ボタンに次のコードを使用します。

    <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として)保存するように促しますか?

ありがとうございました。

20
Dave Jarvis

問題点

コードには次の問題があります。

  • Ajax呼び出し(_<a4j:commandButton .../>_)は添付ファイルでは機能しません。
  • 出力コンテンツの作成は最初に行う必要があります。
  • エラーメッセージの表示では、Ajaxベースの_a4j_タグも使用できません。

溶液

  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"/>_に変更します。

基本的に、commandButtonに関連するすべてのAjax機能を削除します。エラーメッセージを表示し、RichFaces UIスタイルを活用することは引き続き可能です。

参照資料

7
Dave Jarvis

どちらもインラインを使用しません。また、添付ファイル;ただ使う

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('.')) + "\"");
11
Muhammad Salman

コンテンツタイプ(メディアタイプ)をapplication/x-downloadおよびContent-Disposition:attachment;filename=" + fileName;

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

Content-Dispositionヘッダー

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

これは、MIMEタイプとは関係ありませんが、Content-Dispositionヘッダーは次のようになります。

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

実際にクライアントに正しく渡されていることを確認してください(サーバー、プロキシなどによってフィルタリングされていない)。また、出力ストリームを取得する前に、ヘッダーの書き込み順序を変更して設定することもできます。

0
eeq