Spring MVC 监听文件上传进度

具体实现分三个步骤:

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

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

package com.xc.common.resolver;

import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver; import com.xc.common.listener.XcProgressListener; /**
* 重写CommonsMultipartResolver以监听文件上传进度
*/
public class XcCommonsMultipartResolver extends CommonsMultipartResolver { private HttpServletRequest request; protected FileUpload newFileUpload(FileItemFactory fileItemFactory) {
ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
upload.setSizeMax(-1);
if (request != null) {
HttpSession session = request.getSession();
XcProgressListener uploadProgressListener = new XcProgressListener(session);
upload.setProgressListener(uploadProgressListener);
}
return upload;
} public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException {
this.request = request;// 获取到request,要用到session
return super.resolveMultipart(request);
} @Override
public MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException { HttpSession session = request.getSession(); String encoding = "utf-8";
FileUpload fileUpload = prepareFileUpload(encoding); XcProgressListener uploadProgressListener = new XcProgressListener(session);
fileUpload.setProgressListener(uploadProgressListener);
try {
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
return parseFileItems(fileItems, encoding);
} catch (FileUploadBase.SizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
} catch (FileUploadException ex) {
throw new MultipartException("Could not parse multipart servlet request", ex);
}
} }

实现ProgressListener监听器

package com.xc.common.listener;

import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.ProgressListener;
import com.xc.entity.common.ProgressEntity; public class XcProgressListener implements ProgressListener {
private HttpSession session; public XcProgressListener() {
} public XcProgressListener(HttpSession _session) {
session = _session;
ProgressEntity ps = new ProgressEntity();
session.setAttribute("upload_ps", ps);
} public void update(long pBytesRead, long pContentLength, int pItems) {
ProgressEntity ps = (ProgressEntity) session.getAttribute("upload_ps");
ps.setpBytesRead(pBytesRead);
ps.setpContentLength(pContentLength);
ps.setpItems(pItems);
System.out.println(ps.toString());
// 更新
session.setAttribute("upload_ps", ps);
} }

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

package com.xc.entity.common;

/**
* 文件上传进度信息
*/
public class ProgressEntity { private long pBytesRead = 0L;
private long pContentLength = 0L;
private int pItems; public long getpBytesRead() {
return pBytesRead;
} public void setpBytesRead(long pBytesRead) {
this.pBytesRead = pBytesRead;
} public long getpContentLength() {
return pContentLength;
} public void setpContentLength(long pContentLength) {
this.pContentLength = pContentLength;
} public int getpItems() {
return pItems;
} public void setpItems(int pItems) {
this.pItems = pItems;
} @Override
public String toString() {
return "ProgressEntity [pBytesRead=" + pBytesRead + ", pContentLength=" + pContentLength + ", pItems=" + pItems + "]";
} }

配置文件部分修改

springmvc-servlet.xml修改

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

    前言 一个特殊的项目没有用第三方控件库,但用到了DataGridView,由于是客户端产生的数据,所以原始数据源就是一个集合. 根据需要会向集合中添加数据项,或是修改某些数据项的值,但DataGrid ...

  2. WOW.js 使用教程

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

  3. ios View 向上拉界面源码

    如下的资料是关于ios View 向上拉界面的代码. #pragma mark - 上升效果- (void)ToUpSide {          } - (void)moveToUpSide {   ...

  4. lambda 怎么传递ref参数

    lambda 传递ref参数有个语法bug,必须要显式书写参数类型. //如 delegate bool FuncType(ref int num); FuncType func1; func1 = ...

  5. PM过程能力成熟度4级

    话说3级的PM已经非常厉害了,但仍然处于定性阶段.如何才能不动声色的跟BOSS过招?PM 4级就是让数字变成你的嘴巴,开启项目管理的量化大门.因此,4级PM的工作重心(详见上一篇文章中的表格),也会逐 ...

  6. Java文件上传之SpringMVC实例

    一.配置文件 web.xml <?xml version="1.0" encoding="UTF-8"?><web-app version=& ...

  7. Node编码规范

    编码规范 1. 缩进 采用2个空格缩进,而不是tab缩进.空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同.2个空格会让代码看起来紧凑.明快. 2. 变量声明 永远用var声明变量,不加v ...

  8. MyDAL - .UpdateAsync() 之 .Set() 使用

    索引: 目录索引 一.API 列表 1.Set<M, F>(Expression<Func<M, F>> propertyFunc, F newVal) 如: .S ...

  9. Delphi中使用ISuperObject解析Json数据

    Java.Php等语言中都有成熟的框架来解析Json数据,可以让我们使用很少的代码就把格式化好的json数据转换成程序可识别的对象或者属性,同时delphi中也有这样的组件来实现此功能,即Isuper ...

  10. go语言模版编程

    传送门: 柏链项目学院 go语言与模版编程 什么是模版编程 模板是将一个事物的结构规律予以固定化.标准化的成果,它体现的是结构形式的标准化.对于我们程序员来说,更直白的理解是:对于要输出的内容,个人位 ...