jSFを使用してファイルをダウンロードする正しい方法はどれですか?その場合、ファイルのURLを取得するにはどうすればよいですか?
bufferedInputStreamを使用した例を1つ見ました。
http://www.winstonprakash.com/articles/jsf/file_download_link.htm
違いは何ですか?
ありがとう
単純なファイルの場合は、パブリック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 にあります。
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();
}
}
}