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

Stella981
• 阅读 521

首先Spring是一个非常成熟的J2EE框架,其非入侵式的架构为系统的集成和扩展提供了最大的可能。所以Spring MVC下实现进度监听非常容易,甚至不需要改以前的上传业务代码,具体实现分三个步骤:
1、接管CommonsMultipartResolver,重写针对文件上传的请求。
2、在第一步中写入监听,以获取上传进度。
3、修改上传部分的配置文件。
具体见代码

1、CommonsMultipartResolver代码

package com.van.utils.upload.handle;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.van.utils.upload.listener.PJProgressListener;/** * 重写CommonsMultipartResolver以监听文件上传进度 * @author Van * @date 2012-12-12 */public class PJCommonsMultipartResolver 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();            PJProgressListener uploadProgressListener = new PJProgressListener(session);            upload.setProgressListener(uploadProgressListener);        }        return upload;    }    public MultipartHttpServletRequest resolveMultipart(            HttpServletRequest request) throws MultipartException {        this.request = request;// 获取到request,要用到session        return super.resolveMultipart(request);    }     @SuppressWarnings("unchecked")    @Override    public MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {         HttpSession session = request.getSession();        String encoding = "utf-8";        FileUpload fileUpload = prepareFileUpload(encoding);        PJProgressListener uploadProgressListener = new PJProgressListener(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);        }    }}

PJProgressListener 代码:

package com.van.utils.upload.listener;import javax.servlet.http.HttpSession;import org.apache.commons.fileupload.ProgressListener;import com.van.utils.upload.entity.ProgressEntity;public class PJProgressListener implements ProgressListener{    private HttpSession session;    public PJProgressListener() {    }    public PJProgressListener(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);        //更新        session.setAttribute("upload_ps", ps);    }}

上传进度信息记录实体类:

package com.van.utils.upload.entity;/** * 文件上传进度信息 * @author Van * */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 + "]";    }}

配置文件部分修改:

<!-- 文件上传支持  -->    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <property name="defaultEncoding" value="UTF-8" />        <!-- 内存缓存1M -->        <property name="maxInMemorySize" value="1000000"></property>        <!-- 最大2GB -->        <property name="maxUploadSize" value="2000000000" ></property>    </bean>

将org.springframework.web.multipart.commons.CommonsMultipartResolver替换成:com.van.utils.upload.handle.PJCommonsMultipartResolver

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
struts2框架实现上传文件进度条功能
      1.在实现上传进度条功能中,主要是的思想是利用struts2中定义的ProgressListener(进度监听器),里面有一个update(longreadedBytes,longtotalBytes,intcurrentItem)方法,当文件用二进制文件来进行上传时,每上传一部分数据都会去调用这个update方法,update中得到s
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Wesley13 Wesley13
3年前
Java多线程导致的的一个事物性问题
业务场景我们现在有一个类似于文件上传的功能,各个子站点接受业务,业务上传文件,各个子站点的文件需要提交到总站点保存,文件是按批次提交到总站点的,也就是说,一个批次下面约有几百个文件。      考虑到白天提交这么多文件会影响到子站点其他系统带宽,我们将分站点的文件提交到总站点这个操作过程独立出来,放到晚上来做,具体时间是晚上7:00到早上7:00。
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这