随笔-348  评论-598  文章-0  trackbacks-0

项目中所有的文档全部压缩之后存储到数据库,所以需要我们每次从数据库读取二进制然后发送到客户端进行下载。如何在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)  编辑  收藏 所属分类: JavaJSF

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问