最近在一直在使用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