web-dev-qa-db-ja.com

JSFでファイルをダウンロードしますか?

jSFを使用してファイルをダウンロードする正しい方法はどれですか?その場合、ファイルのURLを取得するにはどうすればよいですか?

bufferedInputStreamを使用した例を1つ見ました。

http://www.winstonprakash.com/articles/jsf/file_download_link.htm

違いは何ですか?

ありがとう

15
ErVeY

単純なファイルの場合は、パブリックWebコンテンツ(静的ファイルとJSFファイルを配置する場所)に配置してリンクを作成します。

_<h:outputLink value="/files/file.ext">link</h:outputLink>
_

Servletcontainerは正しいヘッダーを適用することを心配します。

特定の理由(たとえば、サーバーマシンの固定パス、またはデータベース)でパブリックWebコンテンツの外部に配置されている場合は、 InputStream を取得するサーブレットを作成し、少なくとも_Content-Type_、_Content-Disposition_および_Content-Length_ヘッダーに沿って応答の OutputStream に書き込みます。あなたは here の簡単なキックオフの例を見つけることができます。また、サーブレットの_url-pattern_で簡単にリンクできます。

JSF固有の要求パラメーターに応じて動的に生成する場合は、_h:commandLink_または_h:commandButton_によってバインドされているマネージドBeanアクションでも実行できますが、次のことを確認するだけで十分です。 JSFがナビゲーションを手に取らないようにするには、Beanのアクションメソッドの最後に FacesContext#responseComplete() を呼び出します。同じ種類のサーブレットコードを再利用して、ファイルをストリーミングできます。キックオフの例は this answer にあります。

24
BalusC

JSF経由でファイルをダウンロードするには、同様のコードを作成する必要がありました

これが私のJSFページのダウンロードボタンです

<h:commandButton value="Download" action="#{helloBean.downloadFile}" />

そして、それは私のJavaコードです

public void downloadFile() {

    File file = new File("/home/marco/file.txt");
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();  

    response.setHeader("Content-Disposition", "attachment;filename=file.txt");  
    response.setContentLength((int) file.length());  
    ServletOutputStream out = null;  
    try {  
        FileInputStream input = new FileInputStream(file);  
        byte[] buffer = new byte[1024];  
        out = response.getOutputStream();  
        int i = 0;  
        while ((i = input.read(buffer)) != -1) {  
            out.write(buffer);  
            out.flush();  
        }  
        FacesContext.getCurrentInstance().getResponseComplete();  
    } catch (IOException err) {  
        err.printStackTrace();  
    } finally {  
        try {  
            if (out != null) {  
                out.close();  
            }  
        } catch (IOException err) {  
            err.printStackTrace();  
        }  
    }  

}
13