利用commons-fileUpload实现显示进度的文件上传 不指定

Heck post in Web开发 2010/09/10 10:17 评论(0) 阅读(1731) | |
            如果要使用commons-fileUpload来实现显示进度的文件上传的话,那么要按以下几个步骤来进行shy
1.首先我们要熟悉apache的commons-fileUpload,不熟悉的同学,可以到http://commons.apache.org/fileupload/using.htmlhttp://commons.apache.org/fileupload/apidocs/index.html里浏览一番28

2,可以利用Hibernate的Pojo思想进行设计,既然在客户端的目标要显示文件上传的进度,那么就必须得组织一人这样的类,进行提供服务,为了方便管理,利用组合和面向接口编程的习惯我们建立一个uploadInfo管理者uploadInofManger这两个类都是带有接口,同时uploadInfoManager组合了uploadInfo请看我已经实现的代码:

uploadInfoI,这个是反馈对象的接口


UploadInfoImpl这个是反馈对象的实现类:

好了下面,要做的就是创建反馈对象uploadInfo的管理者,那么它应该怎样管理uploadInfo呢,就用接口说明
UploadInfoManagerI:


由于为了可能的重用uploadInfo所以在它的的实现类了会增加一个获取当前uploadInfo的服务
UploadInfoManagerImpl:


下面关键的类来了,就是真正处理request进而包含的要上传文件
特点:根据资源文件的配置来自定义对上传文件的要求,包含类型,大小,内存缓存,临时磁盘缓冲等等,它通过解析request识别它里面的文件项,和非文件项,以list集合形式返回,我写的里面特别注意是它需要有一个工厂类(DiskFileItemFactory)对初始化出来,当然很多设置我们会看到是在初始化它的工厂对象里配置的


在利用FileUpload解析request得到哪些是需要上传项目时当然就是把文件内容保存到服务器了,怎么保存,当然要把责任交给我们打造的一个类CustomerFileUpload:里面有个关键的方法就是:saveFileToServer().此类就是通过组合FileUpload类来提供服务的,当然它获得的特殊资源就是控制器给的request
CustomerFileUpload:


现在好问题来了,怎么没见到产生进度信息的对象在哪里产生,下面就给出,commons-fileupload已经为我们想好了产生进度反馈信息的场所就是FileUpload的监听器,它通过监听servletContext不断触发一个接口的方法产生进度信息,这个方法就是在接口ProgressListener 里,所有上面写FileUpload时肯定有一句是注入监听器的代码:
FileUploadListener:


FileUploadListener里面的update()方法里利用了工厂模式来提供uploadInfo,上的是为了每次监听到内容都要new 一个uploadInfo,还有一个是控制监听处理工作的时间点的计算,这个认真看完http://commons.apache.org/fileupload/using.html的人没有难度知道原理和实现:

下面就是控制器,一个servlet


后台的过程完成了一大半,只要用dwr把不断监听到的内容显示就得了,我直接用dwr把反馈对象的管理者uploadInfoMangerImpl暴露出来:

dwr配置也很简单,里面有一个文章是说它的,其实就是一个客户端的定时器在不断向服务器请求反馈对象的进度信息.
写完了,希望帮助一样爱学习,自学的同学。


来源:Heck's Blog
地址:http://www.hecks.tk/commons-fileUpload-have-progress/
转载时须以链接形式注明作者和原始出处及本声明,否则将追究法律责任,谢谢配合!