spring mvc文件上传实现进度条
2016-03-23 11:12
155 查看
文件上传应该大部分人都接触过,一般都是基于commons-fileupload组件来实现,SpringMVC的文件上传功能也是在commons-fileupload组件提供的功能上面做了一些包装功能,使文件上传开发更容易方便。
看下上传效果图:
项目运行效果:
项目源码地址,发布即可用:https://github.com/wuskyfantasy/fileupload.sys
项目使用spring mvc+mybatis实现,数据库采用mysql,具体参考README就可以发布起来。
一、实现普通文件上传
我们知道,类DispatcherServlet是SpringMVC的入口,在其doDispatch方法里面,我们可以看到它会先去检查有没配置multipartResolver
如果有的话会先执行它的resolveMultipart方法:
因此,我们在配置文件中添加:
则可使用SpringMVC自带的CommonsMultipartResolver实现多个文件上传的功能。
二、实现进度条
现在实现带进度条的文件上传一般都是在客户端用flash上传组件计算,或者是通过客户端插件的方式。前者上传组件有大小的限制,后者对于我们系统来说实现过于复杂,开发难度稍大。因此我们采用服务器端计算文件上传进度,客户端轮询的方式。
Commons-fileupload组件自带了文件上传进度的监听器,类FileUploadBase提供了它的set方法。
ProgressListener是一个接口,我们需要自己实现它的update方法,参数pBytesRead表示已经上传到服务器的字节数,pContentLength表示所有文件的总大小,pItems表示第几个文件:
文件上传进度监听器实现类,FileUploadProgressListener.java。
SpringMVC没有实现监听器,所以如果要监听的话得自己扩展CommonsMultipartResolver类,在newFileUpload里面加入代码设置自己实现的监听器:
ServletFileUploadExt是对ServletFileUpload类进行的扩展,后面会提到。这样在文件上传的过程中,监听器将得到通知已上传的字节数:
自己实现的Resolver类为CustomMultipartResolver,在这个类中需要在每一次上传请求中设定处理上传进度的监听器,并处理文件上传。
?
在配置文件spring-mvc-context.xml中配置使用自定义的Resolver。
?
最终在上传时,会通过commons-fileupload的组件进行上传时,会把上传进度读取到设定的session中,最后通过一个controller访问这个设定的进度值,就可以获取了。获取进度的controller为ProgressController。客户端采用异步的方式获取进度信息进行展示,具体参考源码index-userFile.jsp。
三、取消文件上传
取消文件上传实现方式为上传时保存上传输入流的引用,取消时关闭流,让输入流产生IO异常或者数组越界异常,同时捕获这些异常,则可取消文件上传。
最后补一个配置,spring mvc的项目访问时默认访问某个指定页面或者controller的配置如下:
?
或者
?
具体可参考配置文件:spring-mvc-context.xml
看下上传效果图:
项目运行效果:
项目源码地址,发布即可用:https://github.com/wuskyfantasy/fileupload.sys
项目使用spring mvc+mybatis实现,数据库采用mysql,具体参考README就可以发布起来。
一、实现普通文件上传
我们知道,类DispatcherServlet是SpringMVC的入口,在其doDispatch方法里面,我们可以看到它会先去检查有没配置multipartResolver
如果有的话会先执行它的resolveMultipart方法:
因此,我们在配置文件中添加:
则可使用SpringMVC自带的CommonsMultipartResolver实现多个文件上传的功能。
二、实现进度条
现在实现带进度条的文件上传一般都是在客户端用flash上传组件计算,或者是通过客户端插件的方式。前者上传组件有大小的限制,后者对于我们系统来说实现过于复杂,开发难度稍大。因此我们采用服务器端计算文件上传进度,客户端轮询的方式。
Commons-fileupload组件自带了文件上传进度的监听器,类FileUploadBase提供了它的set方法。
ProgressListener是一个接口,我们需要自己实现它的update方法,参数pBytesRead表示已经上传到服务器的字节数,pContentLength表示所有文件的总大小,pItems表示第几个文件:
文件上传进度监听器实现类,FileUploadProgressListener.java。
SpringMVC没有实现监听器,所以如果要监听的话得自己扩展CommonsMultipartResolver类,在newFileUpload里面加入代码设置自己实现的监听器:
ServletFileUploadExt是对ServletFileUpload类进行的扩展,后面会提到。这样在文件上传的过程中,监听器将得到通知已上传的字节数:
自己实现的Resolver类为CustomMultipartResolver,在这个类中需要在每一次上传请求中设定处理上传进度的监听器,并处理文件上传。
?
?
三、取消文件上传
取消文件上传实现方式为上传时保存上传输入流的引用,取消时关闭流,让输入流产生IO异常或者数组越界异常,同时捕获这些异常,则可取消文件上传。
最后补一个配置,spring mvc的项目访问时默认访问某个指定页面或者controller的配置如下:
?
?
相关文章推荐
- 【Java】讲synchronized最清楚的文章
- 【JAVA并发】基本线程机制
- Java CopyOnWriteArrayList 分析
- 探索新的Java输入/输出(Java的NIO.2)包
- eclipse中项目为什么会出现红色感叹号?
- java实例化对象的过程
- java单例模式使用及注意事项
- java实现给图片添加水印
- Spring事务Transaction配置的五种注入方式详解
- java实现附件预览(openoffice+swftools+flexpaper)
- ArrayList源码剖析
- Spring Security(18)——Jsp标签 博客分类:
- springMVC的入门
- 面试之springmvc工作原理
- JAVA深入研究——Method的Invoke方法。
- java 日志技术汇总
- Extreme Learning Machine的Java源码配置
- 配置JAVA环境变量
- JAVA中的反射机制
- Spring Web MVC详解