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方法调用了该方法,前台可以这样调用:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
或者
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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来调用该页面
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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 ;
}