一、 引言
基于浏览器的文件上传,特别是对于通过<input type="file">标签包含到web页面来实现上传的情况,还存在较严重的性能问题。我们知道,超过10mb的上传文件经常导致一种非常痛苦的用户体验。一旦用户提交了文件,在浏览器把文件上传到服务器的过程中,界面看上去似乎处于静止状态。由于这一切发生在后台,所以许多没有耐心的用户开始认为服务器"挂"了,因而再次提交文件,这当然使得情况变得更糟糕。
在本文中,我们将实现一个具有ajax能力的组件——它不仅实现把文件上传到服务器,而且"实时地"监视文件上传的实际过程。这个组件工作的四个阶段显示于下面的图1,2,3与4中: 【相关文章:三层交换实现远程接入】
为了尽可能使得文件上传感觉更友好些,一旦用户提交文件,许多站点将显示一个中间过程动画(例如一旋转图标)。尽管这一技术在上传提交到服务器时起一些作用,但它还是提供了太少的有关文件上传状态的信息。解决这个问题的另外一种尝试是实现一个applet——它通过ftp把文件上传到服务器。这一方案的缺点是:限制了你的用户,必须要有一个支持java的浏览器。 【扩展阅读:三层交换机的智能流处理技术】
图1.阶段1:选择文件上传 【扩展信息:三层交换主宰局域网】
560)this.style.width=560; onmousewheel = javascript:return big(this) src="/files/uploadimg/20060324/1124050.jpg" border=0>
560)this.style.width=560; onmousewheel = javascript:return big(this) src="/files/uploadimg/20060324/1124051.jpg" border=0>
图2.阶段2:上传该文件到服务器
560)this.style.width=560; onmousewheel = javascript:return big(this) src="/files/uploadimg/20060324/1124052.jpg" border=0>
图3.阶段3:上传完成
560)this.style.width=560; onmousewheel = javascript:return big(this) src="/files/uploadimg/20060324/1124053.jpg" border=0>
图4.阶段4:文件上传摘要
二、 实现该组件
首先,我们分析创建多部分过滤的过程,它将允许我们处理并且监视文件上传。然后,我们将继续实现javaserver faces(jsf)组件-它将提供给用户连续的回馈,以支持ajax的进度条方式。
(一) 多部分过滤:uploadmultipartfilter
多部分过滤的任务是拦截到来的文件上传并且把该文件写到一个服务器上的临时目录中。同时,它还将监视接收的字节数并且确定已经上载该文件的程度。幸运的是,现在有一个优秀的jakarta-commons开源库可以利用(fileupload),可以由它来负责分析一个http多部分请求并且把文件上传到服务器。我们要做的是扩展该库并且加入我们需要的"钩子"来监视已经处理了多少字节。
public class uploadmultipartfilter implements filter{
... 下一页