目前在做基于Layui fly社区的项目epochFly,后台采用Jfinal来做。做好之后应该会开源出来,同时也会正式开放我的个人网站。因为前台静态资源较多,所以要考虑到如何访问到上传的磁盘资源 ,多方搜索,参考到了波总的一个回复。再次在总结一下给各位同学。
配置好上传目录,为 C:/epochFly,上传的所有文件都在这
me.setBaseUploadPath(PropKit.get("config.upload.basePath", "upload"));
默认路径为upload。
配置一个hander
如下:
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.jfinal.handler.Handler; public class FileHandler extends Handler { @Override public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) { if (target.startsWith("/static/file")) { String view = target.substring(target.lastIndexOf("/")); request.setAttribute("view", view); target = "/static/file"; } next.handle(target, request, response, isHandled); } }
需要在 config注册,
me.add(new FileHandler());
该类说明了,所有的静态资源访问请求是/static/file 请求,比如/static/file/aa.jpg
会自动拦截过滤到/static/file请求并携带参数view为aa.jpg
4.controller的配置如下
import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.OutputStream; import com.epoch.base.annotation.ControllerBind; import com.epoch.base.controller.BaseController; import com.jfinal.kit.PropKit; @ControllerBind(controllerKey = "/static") public class StaticResourceController extends BaseController{ public void file() { String view = getAttr("view").toString(); getResponse().setContentType("application/octet-stream;charset=UTF-8"); try { FileInputStream inputStream = new FileInputStream(PropKit.get("config.upload.basePath", "upload")+view); int i=inputStream.available(); byte[]data=new byte[i]; inputStream.read(data); inputStream.close(); OutputStream outputStream=new BufferedOutputStream(getResponse().getOutputStream()); outputStream.write(data); outputStream.flush(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } }
如上,请求与handler请求对应,其中获取到view中,与上传文件的路径做匹配对应,
PropKit.get("config.upload.basePath", "upload")
该方法是获取到配置的静态资源上传目录为C:/epochFly
此时在代码中,只需要通过 项目名称/static/file/******文件
即可放到到磁盘对应的文件
这里有个改进建议,可以将 StaticResourceController 中的代码全部转移到 FileHandler 中,request、response 对象都在里面可以直接用,最后别忘了在 if 中加两行代码:
isHandled[0] = true;
return;
加这两行一是避免 tomcat、jetty 容器处理这个请求,二是辟免执行后面的 next.handle(...)
此外,建议在 finally 块中关闭 outputStream、inputStream
最后,再建议创建一个比较小的 byte[] buffer(例如 new byte[512]),一边从 inputStream 中读,一边往 outputStream 里面写,这样就避免了每次 new 出很大的 buffer,可提升性能
在 for 循环中判断读取的 len 是不是 -1,来代替 inputStream.available();
大致结构如下:
byte[] buf = new byte[512];
int len=-1;
while((len=inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, len);
}