SpringMVC 監聽文件上傳進度


Spring MVC 監聽文件上傳進度

具體實現分三個步驟:

  1. 接管CommonsMultipartResolver,重寫針對文件上傳的請求。
  2. 在第一步中寫入監聽,以獲取上傳進度。
  3. 修改上傳部分的配置文件。

重寫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 監聽文件上傳進度,實現上傳進度條


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM