springMVC是实现前台带进度条文件上传续(二)

      之前写过一遍基于springMVC是实现前台带进度条文件,但是该文章仅是代码层面的,没有做过多解释,今天看到一篇文章正好对上篇文章进行了较为详细的解释,文章原文如下:

        文件上传应该大部分人都接触过,应该大部分人都接触过,一般都是基于commons-fileupload组件来实现,SpringMVC的文件上传功能也是在commons-fileupload组件提供的功能上面做了一些包装功能,使文件上传开发更容易方便。

       看下上传效果图:


 

 

 

 

 

 

 

 

 

 

 

 

 

项目运行效果:

 

 

 

 

 

 

项目源码地址,发布即可用:https://github.com/wuskyfantasy/fileupload.sys

如果下载不了也可以下截fileupload.sys-master.zip附件。

项目使用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,在这个类中需要在每一次上传请求中设定处理上传进度的监听器,并处理文件上传。 

Java代码 复制代码   收藏代码
  1. protected FileUpload newFileUpload(FileItemFactory fileItemFactory) {    
  2.   ServletFileUpload upload = new ServletFileUpload(fileItemFactory);    
  3.   upload.setSizeMax(-1);    
  4.   if (request != null) {    
  5.      HttpSession session = request.getSession();  
  6.      //注意:这里的listener不能公用,即不能放到方法外面  
  7.      FileUploadProgressListener progressListener =   
  8.      new FileUploadProgressListener(session);  
  9.      upload.setProgressListener(progressListener);    
  10.   }    
  11.   return upload;    
  12. }  

 
 
  1. <span style= "font-family:Arial;font-size:12px;"> protected FileUpload newFileUpload(FileItemFactory fileItemFactory) {
  2. ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
  3. upload.setSizeMax(- 1);
  4. if (request != null) {
  5. HttpSession session = request.getSession();
  6. //注意:这里的listener不能公用,即不能放到方法外面
  7. FileUploadProgressListener progressListener =
  8. new FileUploadProgressListener(session);
  9. upload.setProgressListener(progressListener);
  10. }
  11. return upload;
  12. }</span>

 

在配置文件spring-mvc-context.xml中配置使用自定义的Resolver。 

Xml代码 复制代码   收藏代码
  1. <bean id="multipartResolver"   class="com.sunshine.fusys.controllers.CustomMultipartResolver">  
  2.     <property name="defaultEncoding" value="UTF-8" />  
  3.     <property name="maxUploadSize" value="1000000000000" />  
  4. </bean>  
<span style="font-family:Arial;font-size:12px;"><bean id="multipartResolver"   class="com.sunshine.fusys.controllers.CustomMultipartResolver">
    <property name="defaultEncoding" value="UTF-8" />
    <property name="maxUploadSize" value="1000000000000" />
</bean></span>

 

最终在上传时,会通过commons-fileupload的组件进行上传时,会把上传进度读取到设定的session中,最后通过一个controller访问这个设定的进度值,就可以获取了。获取进度的controller为ProgressController。客户端采用异步的方式获取进度信息进行展示,具体参考源码index-userFile.jsp

 

、取消文件上传
        取消文件上传实现方式为上传时保存上传输入流的引用,取消时关闭流,让输入流产生IO异常或者数组越界异常,同时捕获这些异常,则可取消文件上传。

最后补一个配置,spring mvc的项目访问时默认访问某个指定页面或者controller的配置如下:

Xml代码 复制代码   收藏代码
  1. //转向controller  
  2. <mvc:view-controller path="/"  view-name="redirect:/indexMain/index" />  
<span style="font-family:Arial;font-size:12px;">//转向controller
<mvc:view-controller path="/"  view-name="redirect:/indexMain/index" /></span>

或者 

 

Xml代码 复制代码   收藏代码
  1. //转向index.jsp  
  2. <mvc:view-controller path="/"  view-name="/index" />  
<span style="font-family:Arial;font-size:12px;">//转向index.jsp
<mvc:view-controller path="/"  view-name="/index" /></span>

具体可参考配置文件:spring-mvc-context.xml 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值