springmvc 实现上传百分比,上传进度条

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

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

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

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

 

public class MultipartListenerResolver extends CommonsMultipartResolver {

	@Override
	protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {
		String encoding = determineEncoding(request);
		FileUpload fileUpload = prepareFileUpload(encoding);
                //设置监听器
		fileUpload.setProgressListener(new FileUploadProgressListener(request.getSession()));
		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);
		}
	}

}

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

 

 

public class FileUploadProgressListener implements ProgressListener {

	private HttpSession session;

	public FileUploadProgressListener(HttpSession session) {
		this.session = session;
	}

        //pBytesRead  已经上传的大小
        //pContentLength   文件总大小
	@Override
	public void update(long pBytesRead, long pContentLength, int pItems) {
		System.out.println((double)pBytesRead/pContentLength);
                session.setAttribute("progress", (double)pBytesRead/pContentLength);
	}
}

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

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值