Spring MVC 监听文件上传进度

具体实现分三个步骤:

  1. 接管CommonsMultipartResolver,重写针对文件上传的请求。
  2. 在第一步中写入监听,以获取上传进度。
  3. 修改上传部分的配置文件。

重写CommonsMultipartResolver以监听文件上传进度

  1. package com.xc.common.resolver;
  2. import java.util.List;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpSession;
  5. import org.apache.commons.fileupload.FileItem;
  6. import org.apache.commons.fileupload.FileItemFactory;
  7. import org.apache.commons.fileupload.FileUpload;
  8. import org.apache.commons.fileupload.FileUploadBase;
  9. import org.apache.commons.fileupload.FileUploadException;
  10. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  11. import org.springframework.web.multipart.MaxUploadSizeExceededException;
  12. import org.springframework.web.multipart.MultipartException;
  13. import org.springframework.web.multipart.MultipartHttpServletRequest;
  14. import org.springframework.web.multipart.commons.CommonsMultipartResolver;
  15. import com.xc.common.listener.XcProgressListener;
  16. /**
  17. * 重写CommonsMultipartResolver以监听文件上传进度
  18. */
  19. public class XcCommonsMultipartResolver extends CommonsMultipartResolver {
  20. private HttpServletRequest request;
  21. protected FileUpload newFileUpload(FileItemFactory fileItemFactory) {
  22. ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
  23. upload.setSizeMax(-1);
  24. if (request != null) {
  25. HttpSession session = request.getSession();
  26. XcProgressListener uploadProgressListener = new XcProgressListener(session);
  27. upload.setProgressListener(uploadProgressListener);
  28. }
  29. return upload;
  30. }
  31. public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException {
  32. this.request = request;// 获取到request,要用到session
  33. return super.resolveMultipart(request);
  34. }
  35. @Override
  36. public MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {
  37. HttpSession session = request.getSession();
  38. String encoding = "utf-8";
  39. FileUpload fileUpload = prepareFileUpload(encoding);
  40. XcProgressListener uploadProgressListener = new XcProgressListener(session);
  41. fileUpload.setProgressListener(uploadProgressListener);
  42. try {
  43. List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
  44. return parseFileItems(fileItems, encoding);
  45. } catch (FileUploadBase.SizeLimitExceededException ex) {
  46. throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
  47. } catch (FileUploadException ex) {
  48. throw new MultipartException("Could not parse multipart servlet request", ex);
  49. }
  50. }
  51. }

实现ProgressListener监听器

  1. package com.xc.common.listener;
  2. import javax.servlet.http.HttpSession;
  3. import org.apache.commons.fileupload.ProgressListener;
  4. import com.xc.entity.common.ProgressEntity;
  5. public class XcProgressListener implements ProgressListener {
  6. private HttpSession session;
  7. public XcProgressListener() {
  8. }
  9. public XcProgressListener(HttpSession _session) {
  10. session = _session;
  11. ProgressEntity ps = new ProgressEntity();
  12. session.setAttribute("upload_ps", ps);
  13. }
  14. public void update(long pBytesRead, long pContentLength, int pItems) {
  15. ProgressEntity ps = (ProgressEntity) session.getAttribute("upload_ps");
  16. ps.setpBytesRead(pBytesRead);
  17. ps.setpContentLength(pContentLength);
  18. ps.setpItems(pItems);
  19. System.out.println(ps.toString());
  20. // 更新
  21. session.setAttribute("upload_ps", ps);
  22. }
  23. }

创建上传进度信息记录实体类

  1. package com.xc.entity.common;
  2. /**
  3. * 文件上传进度信息
  4. */
  5. public class ProgressEntity {
  6. private long pBytesRead = 0L;
  7. private long pContentLength = 0L;
  8. private int pItems;
  9. public long getpBytesRead() {
  10. return pBytesRead;
  11. }
  12. public void setpBytesRead(long pBytesRead) {
  13. this.pBytesRead = pBytesRead;
  14. }
  15. public long getpContentLength() {
  16. return pContentLength;
  17. }
  18. public void setpContentLength(long pContentLength) {
  19. this.pContentLength = pContentLength;
  20. }
  21. public int getpItems() {
  22. return pItems;
  23. }
  24. public void setpItems(int pItems) {
  25. this.pItems = pItems;
  26. }
  27. @Override
  28. public String toString() {
  29. return "ProgressEntity [pBytesRead=" + pBytesRead + ", pContentLength=" + pContentLength + ", pItems=" + pItems + "]";
  30. }
  31. }

配置文件部分修改

springmvc-servlet.xml修改

  1. <!-- 文件上传的配置 -->
  2. <!-- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> -->
  3. <bean id="multipartResolver" class="com.xc.common.resolver.XcCommonsMultipartResolver">
  4. <property name="maxUploadSize" value="1048576" /><!-- 上传文件大小上限,单位为字节(1MB) -->
  5. <property name="defaultEncoding" value="UTF-8" /><!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
  6. </bean>

参考文章:

Spring MVC 监听文件上传进度,实现上传进度条

SpringMVC 监听文件上传进度的更多相关文章

  1. 基于element ui 实现七牛云自定义key上传文件,并监听更新上传进度

    借助上传Upload 上传组件的 http-request 覆盖默认的上传行为,可以自定义上传的实现 <el-upload multiple ref="sliderUpload&quo ...

  2. 利用Bootstrap简单实现一个文件上传进度条

    © 版权声明:本文为博主原创文章,转载请注明出处 说明: 1. 使用commons-fileupload.jar实现文件上传及进度监听 2. 使用bootstrap的进度条进行页面显示 3. 因为进度 ...

  3. Java使用comms-net jar包完成ftp文件上传进度的检测功能

    本文章只讲述大致的思路与本次功能对应的一些开发环境,具体实现请结合自己的开发情况,仅供参考,如果有不对的地方,欢迎大家指出! 准备环境:JDK1.7 OR 1.8.eclipse.ftp服务器(可自行 ...

  4. HTML5矢量实现文件上传进度条

    在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...

  5. 基于HT for Web矢量实现HTML5文件上传进度条

    在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...

  6. Node.js:上传文件,服务端如何获取文件上传进度

    内容概述 multer是常用的Express文件上传中间件.服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题.在SF上也有同学问了类似问题<nodejs multer有没有查看文件 ...

  7. js获取文件上传进度

    js获取文件上传进度: <input name="file" id="FileUpload" type="file" /> &l ...

  8. 阿里云 oss 小文件上传进度显示

    对阿里云OSS上传小文件时的进度,想过两个方法:一是.通过多线程监測Inputstream剩余的字节数来计算,可是由于Inputstream在两个线程中共用,假设上传线程将Inputstream关闭, ...

  9. PHP中使用Session配合Javascript实现文件上传进度条功能

    Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP .4以前,实现这样的进度条并不容易 ...

随机推荐

  1. IntelliJ IDEA如何激活?

    本文使用的IDEA的版本是:14.0.3 下载IDEA授权服务器(下载地址见最后),并解压,打开解压后的IntelliJIDEALicenseServer目录,可以看到如下的两个文件: Intelli ...

  2. Spring RestTemplate详解

    Spring RestTemplate详解   1.什么是REST? REST(RepresentationalState Transfer)是Roy Fielding 提出的一个描述互联系统架构风格 ...

  3. WOW.js 使用教程

    官网加动画特效,哇哦,下面我介绍一下WOW.js 官网地址:https://www.delac.io/wow/ 点击github可以找到wow.js和wow.min.js 以及animate.css者 ...

  4. C# 利用位运算传递多个参数方法

    前言 在工作中用sendMessage的方法向另外一个进程中传递窗体的位置,长度,宽度四个值,但是sendMessage的方法签名中只有两个参数.于是在网上找到了一些代码,找到了这个利用位运算来合并参 ...

  5. Vue与React两个框架的区别对比

    简单介绍 React--Facebook创建的JavaScript UI框架.它支撑着包括Instagram在内的大多数Facebook网站.React与当时流行的jQuery,Backbone.js ...

  6. MPP-编码示例

    了解MPP的基本功能后,接下来具体分析编码的代码.首先把编码的代码提取出来,方便以后的使用. 完整的编码代码如下,相比较给出的示例代码,做了一些改动,输入的指令全部去除,将函数入口改为利用OpenCV ...

  7. c# 多线程 --Mutex(互斥锁) 【转】

    互斥锁(Mutex) 互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它. 互斥锁可适用于一个共享资源每次只能被一个线程访问的情况 函数: //创建一个处于未获取状态的互斥锁 Pub ...

  8. redis报错:java.net.SocketException: Broken pipe (Write failed); nested exception is redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Broken pipe (Write failed)

    最近写了一个服务通过springboot构建,里面使用了redis作为缓存,发布到服务器运行成功,但是有时候会报redis的错误:org.springframework.data.redis.Redi ...

  9. 数据库【mongodb篇】练习操作

    本文的目标是通过大量的示例,来更好的理解如果在Mongodb中进行数据操作: 初入客户端刚利用 mongod命令进入客户端环境,此时对数据库一无所知: 举目四望,想知道现在有哪些数据库,   show ...

  10. Python学习案例之Web版语音合成播报

    前言 语音合成技术能将用户输入的文字,转换成流畅自然的语音输出,并且可以支持语速.音调.音量设置,打破传统文字式人机交互的方式,让人机沟通更自然. 应用场景 将游戏场景中的公告.任务或派单信息通过语音 ...