0

みんな!

問題があります。jsf Web アプリケーションで Excel ファイルを保存しようとしました。ユーティリティでファイルを生成し、「保存」ウィンドウを取得しようとしましたが、失敗しました。

これが私のコードです:

  <div>
  <h:commandButton value="Apply" actionListener="#{hornPhonesBean.generateReport}"/>
  </div>

と:

   public void generateReport(ActionEvent event) {
    System.out.println("GENERATE REPORT FROM = " + this.dateFrom + "; TO = " + this.dateTo);

    try {
        XSSFWorkbook workbook = (XSSFWorkbook) HornReportGenerator.getWorkbook(null, null);
        String fileName = "1.xlsx";

        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();

        // Some JSF component library or some Filter might have set some headers in the buffer beforehand. We want to get rid of them, else it may collide.
        ec.responseReset(); 

        // Check http://www.w3schools.com/media/media_mimeref.asp for all types. Use if necessary ExternalContext#getMimeType() for auto-detection based on filename.
        ec.setResponseContentType("application/vnd.ms-excel"); 

        // Set it with the file size. This header is optional. It will work if it's omitted, but the download progress will be unknown.
        //ec.setResponseContentLength(contentLength); 

        // The Save As popup magic is done here. You can give it any file name you want, this only won't work in MSIE, it will use current request URL as file name instead.
        ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 

        OutputStream output = ec.getResponseOutputStream();
        workbook.write(output); 
        output.flush();
        output.close();

        fc.responseComplete(); // Important! Otherwise JSF will attempt to render the response which obviously will fail since it's already written with a file and closed.
        System.out.println("END");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

私はここと別のフォーラムからの提案を読みました.

次に、問題は

 <ice:form>, 

私が保管していた場所

 <h:commandButton>, 

そして私はに変更しました

 <h:form>, 

しかし、それは役に立ちませんでした。

おそらくリクエストの問題です-ヘッダーFaces-Request partial/ajaxがあります。しかし、よくわかりません。

アイデアを教えてください - このクレイジーな jsf ダウンロードの問題に既に 4 時間費やしています)

4

1 に答える 1

3

おそらくリクエストの問題です-ヘッダーFaces-Request partial/ajaxがあります。しかし、よくわかりません。

これは、リクエストが ajax リクエストであることを示しています。ajax でファイルをダウンロードすることはできません。Ajax リクエストは JavaScript によって処理されますが、これにはセキュリティ上の理由から、プログラムで [名前を付けて保存]ダイアログを表示したり、クライアントのディスク ファイル システムにアクセスしたり操作したりする機能はありません。

ただし、コード スニペットは、ajax を使用していることを示していません。おそらく、単純化しすぎたか、すべての標準 JSF コマンド コンポーネントで ajax をサイレントに自動有効化する ICEfaces を使用しています。

いずれにしても、ajax リクエストを送信していないことを確認する必要があります。

以下も参照してください。

于 2012-11-20T17:40:53.760 に答える