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

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

package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;

import ;
/**
 * 重写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);
		(-1);
		if (request != null) {
			HttpSession session = ();
			PJProgressListener uploadProgressListener = new PJProgressListener(session);
			(uploadProgressListener);
		}
		return upload;
	}
	public MultipartHttpServletRequest resolveMultipart(
			HttpServletRequest request) throws MultipartException {
		 = request;// 获取到request,要用到session
		return (request);
	}
	
	
 	@SuppressWarnings("unchecked")
	@Override
    public MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {
 		
 		HttpSession session = ();
 		
        String encoding = "utf-8";
        FileUpload fileUpload = prepareFileUpload(encoding);
       
        PJProgressListener uploadProgressListener = new PJProgressListener(session);
        (uploadProgressListener);
        try {
            List
  
  
   
    fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
            return parseFileItems(fileItems, encoding);
        }
        catch ( ex) {
            throw new MaxUploadSizeExceededException((), ex);
        }
        catch (FileUploadException ex) {
            throw new MultipartException("Could not parse multipart servlet request", ex);
        }
    }

}


  
  
PJProgressListener 代码:


package ;
import ;
import ;
import ;

public class PJProgressListener implements ProgressListener{
	private HttpSession session;
	public PJProgressListener() {
	}
	public PJProgressListener(HttpSession _session) {
		session=_session;
		ProgressEntity ps = new ProgressEntity();
		("upload_ps", ps);
	}
	public void update(long pBytesRead, long pContentLength, int pItems) {
		ProgressEntity ps = (ProgressEntity) ("upload_ps");
		(pBytesRead);
		(pContentLength);
		(pItems);
		//更新
		("upload_ps", ps);
	}

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


package ;

/**
 * 文件上传进度信息
 * @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) {
		 = pBytesRead;
	}
	public long getpContentLength() {
		return pContentLength;
	}
	public void setpContentLength(long pContentLength) {
		 = pContentLength;
	}
	public int getpItems() {
		return pItems;
	}
	public void setpItems(int pItems) {
		 = pItems;
	}
	@Override
	public String toString() {
		return "ProgressEntity [pBytesRead=" + pBytesRead + ", pContentLength="
				+ pContentLength + ", pItems=" + pItems + "]";
	}
	
	
	

}

配置文件部分修改:



  
  
	
  
  
		
   
   
		
    
    
		
    
    
		
    
    
		
    
    
	
   
   
  
  

将替换成: