项目中所有的文档全部压缩之后存储到数据库,所以需要我们每次从数据库读取二进制然后发送到客户端进行下载。如何在JSF里面这样做呢?
首先对外的方法这样写,我设置了按钮的actionListener的属性
public void viewContent(ActionEvent event)
{
try
{
ParkLawDTO obj = this.getEnterpriseEnterInBODelegate().getParkLawById(((ParkLawDTO)this.getParkLawDataModel().getRowData()).getParkLaw().getPlId());
Common.downloadFile(FacesContext.getCurrentInstance(), ZipHelper.unzip(obj.getParkLaw().getLawContent()), obj.getParkLaw().getLawName()+".doc", "application/msword;charset=utf-8");
}catch(Exception e){
info("下载文件出错", e);
}
}
第一句是从WebService获得对象的实例,第二句是将所有相应信息传输给下载的公共方法,同时解压缩了相应的二进制。
下面是下载的公共方法
/** *//**
* 向客户端发送需要下载的文件
* @param faces 当前FacesContext
* @param content 文件的字节数组
* @param fileName 客户端接收的文件名
* @param contentType http的content-type
*/
public static void downloadFile(FacesContext faces, byte[] content, String fileName, String contentType)
{
try
{
HttpServletResponse response = (HttpServletResponse) faces.getExternalContext().getResponse();
response.setHeader("Content-disposition", "filename="+ URLEncoder.encode(fileName, "utf-8"));
response.setContentType(contentType);
response.setContentLength(content.length);
ServletOutputStream sos = response.getOutputStream();
sos.write(content);
sos.flush();
sos.close();
//需要呼叫Complete
faces.responseComplete();
}catch(Exception e){
e.printStackTrace();
}
}
Content-disposition中一定不可以加attachment,经过测试,在IE6下(其他浏览器没测试过),会导致无法打开临时文件(我的是word文档),而且经常出现无法下载文件。
---------------------------------------------------------
专注移动开发
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2008-12-23 10:13
TiGERTiAN 阅读(1386)
评论(0) 编辑 收藏 所属分类:
Java 、
JSF