`
herestay
  • 浏览: 36059 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多
首先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
分享到:
评论

相关推荐

    spring mvc文件上传实现进度条

    在Spring MVC框架中,文件上传是一项常见的功能,而实现文件上传进度条则能提供更好的用户体验。这个场景通常涉及到前端的JavaScript或jQuery库(如jQuery File Upload)与后端的Spring MVC控制器之间的交互,以及...

    spring mvc 上传文件显示进度

    在Spring MVC中实现文件上传并显示进度是一项常见的需求,特别是在用户需要等待较长时间的大型文件上传时。这个功能可以通过监听文件上传的进度并在前端实时更新来提升用户体验。下面将详细介绍如何利用Spring MVC...

    spring mvc上传文件

    4. **进度条显示**:通过监听Ajax请求的进度,可以实现文件上传进度的可视化。 5. **多文件上传**:如果需要,可以通过修改前端表单和后端Controller来支持同时上传多个文件。 通过这些步骤,你可以实现一个简单的...

    spring mvc html5带进度条上传的例子.zip

    在本示例中,"spring mvc html5带进度条上传的例子" 展示了如何在Spring MVC中集成HTML5的新特性,特别是文件上传功能,以及如何在上传过程中展示进度条以提升用户体验。 HTML5中的`&lt;input type="file"&gt;`元素提供了...

    spring mvc ajax异步文件的上传和普通文件上传

    在Spring MVC框架中,文件上传是一项常见的功能,无论是普通的文件上传还是通过Ajax实现的异步文件上传,都为用户提供了更好的交互体验。本篇将详细讲解这两种方式的实现原理及步骤。 首先,让我们来理解一下普通...

    spring+ajax+velocity实现进度条上传

    实现“spring+ajax+velocity实现进度条上传”的步骤如下: 1. **配置Spring MVC**:在Spring的配置文件中,我们需要定义一个处理器映射器和视图解析器,以便Spring能正确地处理请求和返回响应。同时,需要设置Multi...

    springmvc图片上传带进度条实例

    在本文中,我们将深入探讨如何使用Spring MVC框架创建一个图片上传功能,并且集成进度条来实时展示上传进度。...这个实例可以帮助开发者理解如何在实际项目中结合Spring MVC实现文件上传与进度显示功能。

    ssm文件上传,带进度条

    在这个"ssm文件上传,带进度条"的项目中,我们将探讨如何在SSM框架下实现文件上传并显示上传进度。 1. **文件上传组件** 在Java Web中,文件上传通常使用`Commons FileUpload`库或Spring MVC的`MultipartFile`接口...

    springmvc带进度条上传源码

    在Spring MVC框架中实现文件上传并提供进度条功能是一项实用且复杂的任务,涉及到前端与后端的交互以及数据传输过程的监控。以下是对这个主题的详细解析。 首先,我们需要理解Spring MVC的基本工作原理。Spring MVC...

    spring jquery实现进度条

    本教程将详细讲解如何利用Spring和jQuery来实现文件上传过程中显示进度条的功能,提升用户的操作体验。 首先,我们需要理解文件上传的基本流程。当用户选择一个文件进行上传时,浏览器会创建一个XMLHttpRequest对象...

    java 上传文件,实时获取上传进度.

    本篇文章将详细探讨如何在Java环境中实现文件上传并实时显示上传进度。 首先,我们需要了解HTTP协议中的文件上传机制。在HTTP中,文件上传通常通过POST请求完成,数据以多部分/形式(Multipart/form-data)的形式...

    spring mvc上传 下载

    至于文件下载,Spring MVC提供了`ResponseEntity`和`HttpHeaders`类来构造HTTP响应,以实现文件流的下载。下面是一个典型的文件下载Controller方法: ```java @GetMapping("/download/{filename}") public Response...

    spring MVC + bootstrap实现文件上传示例(带进度条)

    在本文中,我们将深入探讨如何使用Spring MVC和...4. 在Spring MVC控制器中处理文件上传,并调用监听器更新进度。 以上就是使用Spring MVC和Bootstrap构建一个带进度条的文件上传示例的完整流程,希望对你有所帮助。

    JAVA -jquery 文件上传带进度条

    在Java和jQuery的世界里,实现文件上传带进度条的功能是一项常见的需求,特别是在用户交互体验日益重要的今天。这个功能可以提供给用户一个实时反馈,让他们了解文件上传的状态,从而提升用户体验。接下来,我们将...

    struts2(ssh)带进度条文件上传 demo 的jar包1

    在Struts2中,实现文件上传功能是非常常见的需求,而带进度条的文件上传则可以提供更好的用户体验,让用户了解文件上传的进度,减少用户的等待焦虑感。 Struts2的文件上传主要依赖于Apache的Commons FileUpload库。...

    java文件上传进度条学习资料分享c

    下载并解压这个文件后,开发者可以研究其中的代码,了解如何在实际项目中实现文件上传进度条。 “下载及使用说明.txt”文件应该提供了下载和使用本学习资料的具体步骤,包括如何运行示例项目,如何查看和修改代码等...

    WEB超大文件带进度条上传

    本话题将围绕"WEB超大文件带进度条上传"这个主题,详细介绍Java如何实现这一功能。 一、断点续传原理 断点续传是一种允许用户中断文件传输后从上次中断的地方继续传输的技术,尤其适用于网络环境不稳定或文件体积...

    java图片上传进度条

    - JavaScript:使用XMLHttpRequest或fetch API监听文件上传的进度事件,例如`onprogress`,根据接收到的已上传字节数更新进度条的值。 2. **后端实现**: - Java中的文件上传通常使用Servlet或Spring MVC框架处理...

    extjs java 上传文件进度条

    6. **事件监听与回调**:在ExtJS中,可以设置事件监听器来捕获文件上传的进度变化,然后调用回调函数更新进度条。例如,`fileuploadstart`、`fileuploadprogress`和`fileuploadend`等事件。 7. **安全性与错误处理*...

    spring mvc 上传(ajaxfileupload.js)、下载

    在这个场景中,我们关注的是如何利用Spring MVC实现文件的上传和下载功能,并且特别提到了`ajaxfileupload.js`这个JavaScript库。 文件上传是Web应用中的常见需求,Spring MVC提供了方便的API来处理这类操作。首先...

Global site tag (gtag.js) - Google Analytics