SpringMVC实现文件上传的监听器

在项目中使用的是springmvc,在spring mvc中的上传文件的功能做的很多好,项目中使用都很方便。最近做的项目要实现上传显示上传进度,百分比;但是发现springmvc貌似没有实现这样的功能,所以就只有自己来小小的扩展一下。

       springmvc中内部上传使用的是fileupload,而其实fileupload是提供了上传监控的功能的,了解了这个之后实现起来就简单了。

1.  首先跟踪一下org.springframework.web.multipart.commons.CommonsMultipartResolver这个类默认的实现,最后发现在parseRequest这个方法中能够获取到FileUpload对象

2.  创建一个类MultipartListenerResolver,继承CommonsMultipartResolver,覆盖方法parseRequest

 

Java代码   收藏代码
  1. public class MultipartListenerResolver extends CommonsMultipartResolver {  
  2.   
  3.     @Override  
  4.     protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {  
  5.         String encoding = determineEncoding(request);  
  6.         FileUpload fileUpload = prepareFileUpload(encoding);  
  7.                 //设置监听器  
  8.         fileUpload.setProgressListener(new FileUploadProgressListener(request.getSession()));  
  9.         try {  
  10.             List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);  
  11.             return parseFileItems(fileItems, encoding);  
  12.         } catch (FileUploadBase.SizeLimitExceededException ex) {  
  13.             throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);  
  14.         } catch (FileUploadException ex) {  
  15.             throw new MultipartException("Could not parse multipart servlet request", ex);  
  16.         }  
  17.     }  
  18.   
  19. }  

 3. 创建监听器类FileUploadProgressListener,构造方法接收一个session对象,把当前上传的进度发入到session中

 

 

Java代码   收藏代码
  1. public class FileUploadProgressListener implements ProgressListener {  
  2.   
  3.     private HttpSession session;  
  4.   
  5.     public FileUploadProgressListener(HttpSession session) {  
  6.         this.session = session;  
  7.     }  
  8.   
  9.         //pBytesRead  已经上传的大小  
  10.         //pContentLength   文件总大小  
  11.     @Override  
  12.     public void update(long pBytesRead, long pContentLength, int pItems) {  
  13.         System.out.println((double)pBytesRead/pContentLength);  
  14.             <span style="font-size: 12px; line-height: 1.5;">    session.setAttribute("progress", (double)pBytesRead/pContentLength);</span>  
  15.     }  
  16. }  

4. 最后就可以直接对外提供一个接口来从session中读取上传的进度,前台通过ajax来访问

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值