最近在一直在使用JFinal进行web项目的开发工做,使用起来感受很是之方便效率,不愧是名为急速WEB开发框架,呵呵! java
废话不说,进入正题。项目开发过程当中常常遇到文件的上传于下载,JFinal中提供的getFile与renderFile方法很是的方便,基本能够知足经常使用的操做,但是今天忽然发现中文名称的文件在Windows+Tomcat环境下使用renderFile方法提供下载时出现了文件名乱码的问题。最后经过这篇文章中的内容获得了启发,因而便本身动手写重写了一个可以解决乱码问题的render方法。代码以下 web
public class MyFileRender extends Render { private File file; private ServletContext servletContext; public MyFileRender(File file) { this.file = file; this.servletContext = JFinal.me().getServletContext(); } @Override public void render() { if (file == null || !file.isFile() || file.length() > Integer.MAX_VALUE) { RenderFactory.me().getError404Render().setContext(request, response).render(); return ; } //源码中的代码 //response.addHeader("Content-disposition", "attachment; filename=" + file.getName()); //修改后的代码 解决中文乱码问题 try { response.addHeader("Content-disposition", "attachment; filename=" + new String(file.getName().getBytes("GBK"), "ISO8859-1")); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } String contentType = servletContext.getMimeType(file.getName()); if (contentType == null) { contentType = DEFAULT_FILE_CONTENT_TYPE; // "application/octet-stream"; } response.setContentType(contentType); response.setContentLength((int)file.length()); InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = new BufferedInputStream(new FileInputStream(file)); outputStream = response.getOutputStream(); byte[] buffer = new byte[1024]; for (int n = -1; (n = inputStream.read(buffer)) != -1;) { outputStream.write(buffer, 0, n); } outputStream.flush(); } catch (Exception e) { throw new RenderException(e); } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (outputStream != null) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
在使用中能够经过render(new MyFileRender(...))的方式进行调用。 app
总的来讲JFinal的扩展性仍是很好的,在项目中你们均可应使用相似的方法来实现一些个性化的需求。 框架
最后感谢波波平时的耐心指导,但愿JFinal愈来愈耀眼! ide