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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值