AJAX JSF组件实现高性能的文件上载
来源:网络 更新时间:2014-12-2
一、引言
基于浏览器的文件上传,特别是对于通过<inputtype="file">标签包含到Web页面来实现上传的情况,还存在较严重的性能问题。我们知道,超过10MB的上传文件经常导致一种非常痛苦的用户体验。一旦用户提交了文件,在浏览器把文件上传到服务器的过程中,界面看上去似乎处于静止状态。由于这一切发生在后台,所以许多没有耐心的用户开始认为服务器"挂"了,因而再次提交文件,这当然使得情况变得更糟糕。
为了尽可能使得文件上传感觉更友好些,一旦用户提交文件,许多站点将显示一个中间过程动画(例如一旋转图标)。尽管这一技术在上传提交到服务器时起一些作用,但它还是提供了太少的有关文件上传状态的信息。解决这个问题的另外一种尝试是实现一个Applet——它通过FTP把文件上传到服务器。这一方案的缺点是:限制了你的用户,必须要有一个支持Java的浏览器。
在本文中,我们将实现一个具有AJAX能力的组件——它不仅实现把文件上传到服务器,而且"实时地"监视文件上传的实际过程。这个组件工作的四个阶段显示于下面的图1,2,3和4中:
图1.阶段1:选择文件上传
图2.阶段2:上传该文件到服务器
图3.阶段3:上传完成
图4.阶段4:文件上传摘要
二、实现该组件
首先,我们分析创建多部分过滤的过程,它将允许我们处理并且监视文件上传。然后,我们将继续实现JavaServerFaces(JSF)组件-它将提供给用户连续的回馈,以支持AJAX的进度条方式。
(一)多部分过滤:UploadMultipartFilter
多部分过滤的任务是拦截到来的文件上传并且把该文件写到一个服务器上的临时目录中。同时,它还将监视接收的字节数并且确定已经上载该文件的程度。幸运的是,现在有一个优秀的Jakarta-Commons开源库可以利用(FileUpload),可以由它来负责分析一个HTTP多部分请求并且把文件上传到服务器。我们要做的是扩展该库并且加入我们需要的"钩子"来监视已经处理了多少字节。
publicclassUploadMultipartFilterimplementsFilter{
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)
throwsIOException,ServletException{
HttpServletRequesthRequest=(HttpServletRequest)request;
//检查是否我们在处理一个多部分请求
StringcontentHeader=hRequest.getHeader("content-type");
booleanisMultipart=(contentHeader!=null&&contentHeader.indexOf("multipart/form-data")!=-1);
if(isMultipart==false){
chain.doFilter(request,response);
}else{
UploadMultipartRequestWrapperwrapper=newUploadMultipartRequestWrapper(hRequest);
chain.doFilter(wrapper,response);
}
...
}
正如你所见,UploadMultipartFilter类简单地检查了当前的请求是否是一个多部分请求。如果该请求不包含文件上传,该请求将被传递到请求链中的下一个过滤,而不进行任何另外的处理。否则,该请求将被包装在一个UploadMultipartRequestWrapper中。
(二)UploadMultipartRequestWrapper类
publicclassUploadMultipartRequestWrapper
extendsHttpServletRequestWrapper{
privateMap<String,String>formParameters;
privateMap<String,FileItem>fileParameters;
publicUploadMultipartRequestWrapper(HttpServletRequestrequest){