【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
最近在一直在使用JFinal进行web项目的开发工作,使用起来感觉非常之方便效率,不愧是名为急速WEB开发框架,呵呵!
废话不说,进入正题。项目开发过程中经常遇到文件的上传于下载,JFinal中提供的getFile与renderFile方法非常的方便,基本可以满足常用的操作,可是今天突然发现中文名称的文件在Windows+Tomcat环境下使用renderFile方法提供下载时出现了文件名乱码的问题。最后通过这篇文章中的内容得到了启发,于是便自己动手写重写了一个能够解决乱码问题的render方法。代码如下
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(...))的方式进行调用。
总的来说JFinal的扩展性还是很好的,在项目中大家都可应使用类似的方法来实现一些个性化的需求。
最后感谢波波平时的耐心指导,希望JFinal越来越耀眼!
来源:oschina
链接:https://my.oschina.net/u/935698/blog/107363