SpringMVC 監聽文件上傳進度
阿新 • • 發佈:2019-02-13
針對 byte cee 文件上傳 ipa read except lte mon
Spring MVC 監聽文件上傳進度
具體實現分三個步驟:
- 接管CommonsMultipartResolver,重寫針對文件上傳的請求。
- 在第一步中寫入監聽,以獲取上傳進度。
- 修改上傳部分的配置文件。
重寫CommonsMultipartResolver以監聽文件上傳進度
package com.xc.common.resolver; 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.xc.common.listener.XcProgressListener; /** * 重寫CommonsMultipartResolver以監聽文件上傳進度 */ public class XcCommonsMultipartResolver 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(); XcProgressListener uploadProgressListener = new XcProgressListener(session); upload.setProgressListener(uploadProgressListener); } return upload; } public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException { this.request = request;// 獲取到request,要用到session return super.resolveMultipart(request); } @Override public MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException { HttpSession session = request.getSession(); String encoding = "utf-8"; FileUpload fileUpload = prepareFileUpload(encoding); XcProgressListener uploadProgressListener = new XcProgressListener(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); } } }
實現ProgressListener監聽器
package com.xc.common.listener; import javax.servlet.http.HttpSession; import org.apache.commons.fileupload.ProgressListener; import com.xc.entity.common.ProgressEntity; public class XcProgressListener implements ProgressListener { private HttpSession session; public XcProgressListener() { } public XcProgressListener(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); System.out.println(ps.toString()); // 更新 session.setAttribute("upload_ps", ps); } }
創建上傳進度信息記錄實體類
package com.xc.entity.common; /** * 文件上傳進度信息 */ 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 + "]"; } }
配置文件部分修改
springmvc-servlet.xml修改
<!-- 文件上傳的配置 -->
<!-- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> -->
<bean id="multipartResolver" class="com.xc.common.resolver.XcCommonsMultipartResolver">
<property name="maxUploadSize" value="1048576" /><!-- 上傳文件大小上限,單位為字節(1MB) -->
<property name="defaultEncoding" value="UTF-8" /><!-- 請求的編碼格式,必須和jSP的pageEncoding屬性一致,以便正確讀取表單的內容,默認為ISO-8859-1 -->
</bean>
參考文章:
Spring MVC 監聽文件上傳進度,實現上傳進度條
SpringMVC 監聽文件上傳進度