Java类如下
public static void downloadFile(String path,String fileName) {
try {
// 获得JSF上下文环境
FacesContext context = FacesContext.getCurrentInstance();
// 获得ServletContext对象
ServletContext servletContext = (ServletContext) context
.getExternalContext().getContext();
// 取得文件的绝对路径
String realName = servletContext.getRealPath(path) + "/"
+ fileName;
HttpServletResponse httpServletResponse = (HttpServletResponse) context .getExternalContext().getResponse();
downloadFile(httpServletResponse,realName,fileName);
} catch (IOException e) {
e.printStackTrace();
}
FacesContext.getCurrentInstance().responseComplete();
}
public static void downloadFile(HttpServletResponse response,String realName,String fileName) throws IOException
{
response.setHeader("Content-disposition",
"attachment; filename=" + fileName);
response.setContentType("application/x-download");
//File exportFile = new File(realName);
//response.setContentLength((int) exportFile.length());
ServletOutputStream servletOutputStream = response.getOutputStream();
byte[] b = new byte[1024];
int i = 0;
FileInputStream fis = new java.io.FileInputStream(realName);
while ((i = fis.read(b)) > 0) {
servletOutputStream.write(b, 0, i);
}
}
try {
// 获得JSF上下文环境
FacesContext context = FacesContext.getCurrentInstance();
// 获得ServletContext对象
ServletContext servletContext = (ServletContext) context
.getExternalContext().getContext();
// 取得文件的绝对路径
String realName = servletContext.getRealPath(path) + "/"
+ fileName;
HttpServletResponse httpServletResponse = (HttpServletResponse) context .getExternalContext().getResponse();
downloadFile(httpServletResponse,realName,fileName);
} catch (IOException e) {
e.printStackTrace();
}
FacesContext.getCurrentInstance().responseComplete();
}
public static void downloadFile(HttpServletResponse response,String realName,String fileName) throws IOException
{
response.setHeader("Content-disposition",
"attachment; filename=" + fileName);
response.setContentType("application/x-download");
//File exportFile = new File(realName);
//response.setContentLength((int) exportFile.length());
ServletOutputStream servletOutputStream = response.getOutputStream();
byte[] b = new byte[1024];
int i = 0;
FileInputStream fis = new java.io.FileInputStream(realName);
while ((i = fis.read(b)) > 0) {
servletOutputStream.write(b, 0, i);
}
}
使用方法
1、在backing bean的方法中调用函数1即可。如Abean中download方法调用了该方法,前台可以这样调用:

或者

2、jsp页面可以这样调用:
<%@ page contentType="text/html; charset=gb2312"%><%@page import="java.io.*"%><%
String filename = "";
if (request.getParameter("filename") != null) {
filename = request.getParameter("filename");
}
try {
framework.util.FileUtils.downloadFile(response,getServletContext().getRealPath(filename),filename);
} catch(final IOException e) {
System.out.println ( "出现IOException." + e );
} catch(final IllegalStateException e) {
System.out.println ( "出现IllegalStateException." + e );
}
%>
String filename = "";
if (request.getParameter("filename") != null) {
filename = request.getParameter("filename");
}
try {
framework.util.FileUtils.downloadFile(response,getServletContext().getRealPath(filename),filename);
} catch(final IOException e) {
System.out.println ( "出现IOException." + e );
} catch(final IllegalStateException e) {
System.out.println ( "出现IllegalStateException." + e );
}
%>
于是jsf页面我们可以借助outputlink来调用该页面



3、加入下载文件权限控制
在多数情况,我们可能需要对不合法的用户进行权限控制,而通过此通用函数就可以将文件下载权限控制集中到一个点上,减少冗余代码和繁琐的控制。
我们可以在第二个downloadFile增加一个参数HttpServletRequest request,然后在该函数开头加上判断权限的语句,如:
//取得权限Bean后,进行权限判断和提示
if (idBean==null||idBean.getUserLev().equals("0"))
{
PrintWriter out = response.getWriter();
out.println("<script language='javascript'>alert('对不起,您还没有登录系统,没有下载的权限!');</script>");
return;
}
if (idBean==null||idBean.getUserLev().equals("0"))
{
PrintWriter out = response.getWriter();
out.println("<script language='javascript'>alert('对不起,您还没有登录系统,没有下载的权限!');</script>");
return;
}