本文共 2970 字,大约阅读时间需要 9 分钟。
一. 前言
上一篇博客我们了解了struts2框架的文件下载功能代码,我们可以从中总结到,struts2主要是通过其xml的配置来处理文件下载的,也就是将普通io流文件下载的页面响应方式的这部分代码分离出来,使用xml配置来处理,这也是struts2的特性。那么针对于jfinal框架,其在处理文件下载方面会不会有什么特殊的处理方式呢? 那么,今天我们将重点放在jfinal框架的文件下载功能方面,直接切入主题:二. 实例
1. 一般需要加入的jar包:
commons.fileupload-1.2.1.jar和commons.io-1.4.0.jar, 2. jfinal的config常量的配置:/** 配置常量 */ public void configConstant(Constants me) { me.setBaseDownloadPath("upload"); //设置文件下载的默认基础路径 }
3. 方法实例1:
//jfinal文件下载 //jfinal框架下载装了所有的输入输出流方法,但在实际运行中很容易出现浏览器的兼容问题,所以在项目中谨慎使用 public void downloadFile() throws IOException{ //通过pathkit.getwebrootpath获取项目的根目录,或者在config配置默认的文件下载根路径 String basePath = PathKit.getWebRootPath() +"/upload/jpg"; //获取前台的传递的文件名(包括文件格式,例如"test.jpg") String fileName = getPara("downFileName"); //根据根目录和文件名,拼接成完整的file路径 String targetPath = basePath+File.separator+fileName; //该相对路径用于测试使用config配置默认下载的根路径功能 String fileName2 = "/jpg"+File.separator+fileName; //方法1-1:在config配置默认下载的基础路径下,获取文件的相对路径,弹出下载框 renderFile(fileName2); //jfinal3.1的新特性,可自定义下载名,下载名需自行添加后缀格式 //renderFile(fileName2,"自定义新的文件名.jpg"); //方法1-2:jfinal提供了一个重载方法专门应根据绝对路径下载文件的需求,可以下载任意地方的文件 //renderFile(new File(targetPath)); }
4. 方法实例2:
//jfinal文件下载,使用普通io流方式下载 public void downloadFile() throws IOException{ //通过pathkit.getwebrootpath获取项目的根目录,或者在config配置默认的文件下载根路径 String basePath = PathKit.getWebRootPath() +"/upload/jpg"; //获取前台的传递的文件名(包括文件格式,例如"test.jpg") String fileName = getPara("downFileName"); //根据根目录和文件名,拼接成完整的file路径 String targetPath = basePath+File.separator+fileName; //普通IO流实现下载的功能 HttpServletResponse res = getResponse(); //创建response回应 res.setContentType("text/html; charset=UTF-8"); //设置编码字符 res.setContentType("application/x-msdownload"); //设置内容类型 res.setHeader("Content-disposition", "attachment;filename="+fileName);//设置下载的文件名称 OutputStream out = res.getOutputStream(); //创建页面返回方式为输出流,可弹出下载框 //创建输入流读取文件 InputStream is = new FileInputStream(targetPath); byte[] Buffer = new byte[4096]; int size = 0; while((size=is.read(Buffer)) != -1){ out.write(Buffer, 0, size); } //关闭和释放流 out.flush(); out.close(); is.close(); renderNull(); }
三. 总结
1.从实例1可以看出,jfinal实现文件下载功能是非常简单的,只需要一个renderFile()渲染方法,因为jfinal已经封装了所有的输入输出流方法,程序员只需要提供文件路径即可实现下载功能,只需写几行代码就可以打完收枪,也体现了jfinal的“没有繁琐、没有复杂,只有妙不可言”的特点;2.然而,为什么在这里我会添加多一个在jfinal框架里面使用普通io流下载文件的方法,因为使用jfinal框架的renderFile文件下载方法并不是对所有的浏览器都能有效兼容,比如ie浏览器就没办法实现(可能本人测试没办法实现,如果有实现的方法可多交流),而且极容易出现jetty服务器的io流异常: com.jfinal.render.RenderException: 和org.eclipse.jetty.io.EofException,虽然前台下载文件没问题,但后台却总会报错(这个问题本人没有解决,若有解决办法,可否告知),所以在项目中需谨慎使用框架自带的下载方法;
3.实践是检验认识真理性的唯一标准,根据代码和注释多进行尝试,则很快就会明白其中的原理
上一篇: 下一篇: