0

Apache POI を使用して、拡張子が .docx のドキュメントを生成しています。ヘッダー応答 (HttpServletResponse) にファイル名を設定しましたが、ブラウザーは URL の末尾に同じ名前のファイルを保存します。例:

私のブラウザの URL は localhost:8080/MyProject/mypage.jsf です。ダウンロードされたファイルの名前は mypage.jsf で、ヘッダーに設定された名前 (HttpServletResponse) は無視されます。docx のファイル拡張子を編集すれば、内容は問題ありません。

コードは次のとおりです。

    private void generateDocument() throws IOException{
      XWPFDocument document = new XWPFDocument();
      //load document here

        FacesContext facesContext = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) facesContext
                .getExternalContext().getResponse();

        response.reset();
        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");

        ServletOutputStream out = response.getOutputStream();
        document.write(out);

        response.setHeader("Content-Disposition",
                "attachment; filename=my_document.docx");
        facesContext.responseComplete();            
}

Ps。Richfaces 4 を使用しています

ありがとう

4

1 に答える 1

0

コメントから回答への昇格:

サーブレット出力ストリームに書き込む前に、response.setHeader呼び出しをに移動する必要があります。フレームワークが大量のバッファリングを行っていない限り、Excelファイルをストリームに書き込み終えるずっと前に、フレームワークは応答ヘッダーを送信します。ヘッダーはデータの前に送信する必要があるため、データの送信を開始するとすぐに新しいヘッダーを追加できなくなります。

(ほとんどのフレームワークはわずかなバッファリングを行うため、単純なテキスト出力で作業する場合、数行の応答を書き込んだ後でも、多くの場合、いくつかの余分なヘッダーを忍び込むことができます。回避できる場合は、これに依存しないことをお勧めします。 )。

コードを次のように変更する必要があります。

    FacesContext facesContext = FacesContext.getCurrentInstance();
    HttpServletResponse response = (HttpServletResponse) facesContext
            .getExternalContext().getResponse();

    response.reset();
    response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
    response.setHeader("Content-Disposition",
            "attachment; filename=my_document.docx");

    ServletOutputStream out = response.getOutputStream();
    document.write(out);

    facesContext.responseComplete();          
于 2012-07-27T08:12:57.497 に答える