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 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 + "]";
}
}
配置檔案部分修改:
將org.springframework.web.multipart.commons.CommonsMultipartResolver替換成:com.van.utils.upload.handle.PJCommonsMultipartResolver