使用 JSF 下载文件?
使用JSF下载文件的正确方法是什么?,只需放置一个指向该文件的链接?在这种情况下,我如何获得文件URL?
我看过一个使用BufferedInputStream的例子:
http://www.winstonprakash.com/articles/jsf/file_download_link.htm
有什么区别?
谢谢
使用JSF下载文件的正确方法是什么?,只需放置一个指向该文件的链接?在这种情况下,我如何获得文件URL?
我看过一个使用BufferedInputStream的例子:
http://www.winstonprakash.com/articles/jsf/file_download_link.htm
有什么区别?
谢谢
如果它是一个简单的文件,只需放在公共Web内容中(在那里放置静态和JSF文件)并创建一个链接。
<h:outputLink value="/files/file.ext">link</h:outputLink>
servletcontainer 将担心应用正确的标头。
如果由于某些特定原因(例如,在服务器计算机的固定路径中,或在数据库中)它位于公共Web内容之外,则创建一个servlet,该servlet获取它的输入流
并将其写入响应的输出流
,至少沿着,和标头。你可以在这里找到一个简单的开球示例。也可以简单地在servlet的.Content-Type
Content-Disposition
Content-Length
url-pattern
如果要动态生成它,并且依赖于 JSF 特定的请求参数,那么你也可以在受管理的 Bean 操作中执行此操作,该操作受 or 绑定,但你只需要确保在 Bean 的操作方法结束时调用 FacesContext#responseComplete()
来防止 JSF 将导航掌握在手中。可以重用相同类型的 servlet 代码来流式传输文件。您可以在此答案中找到一个启动示例。h:commandLink
h:commandButton
我需要制作类似的代码才能通过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();
}
}
}