package com.mtf.vega.interceptor;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.mtf.vega.exception.VegaException;
/**
* 响应编码拦截器
*/
public class FileUploadInterceptor implements HandlerInterceptor {
private static final Log logger = LogFactory.getLog(FileUploadInterceptor.class);
private Long maxUploadSize;
private Boolean checkMime;
private String allowMimes;
/**
* 设定最大上传文件大小
*
* @param maxUploadSize 字节数
*/
public void setMaxUploadSize(Long maxUploadSize) {
this.maxUploadSize = maxUploadSize;
}
/**
* 设定是否验证文件类型
*
* @param checkMime 是否
*/
public void setCheckMime(Boolean checkMime) {
this.checkMime = checkMime;
}
/**
* 设定允许上传的文件类型
*
* @param allowMimes 文件类型列表,以逗号分隔
*/
public void setAllowMimes(String allowMimes) {
this.allowMimes = allowMimes.trim().toLowerCase();
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) throws Exception {
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView modelAndView) throws Exception {
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
// 未设定最大上传文件大小
if (maxUploadSize == null || maxUploadSize <= 0) return true;
// 判断是否文件上传
if (request != null && ServletFileUpload.isMultipartContent(request)) {
ServletRequestContext ctx = new ServletRequestContext(request);
// 获取上传文件尺寸大小
long requestSize = ctx.contentLength();
if (requestSize > maxUploadSize) {
// 当上传文件大小超过指定大小限制后,模拟抛出MaxUploadSizeExceededException异常
throw new MaxUploadSizeExceededException(maxUploadSize);
}
// 验证文件类型
if (checkMime != null && checkMime == true) {
if (request instanceof MultipartHttpServletRequest) {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> files = multipartRequest.getFileMap();
Iterator<String> iterator = files.keySet().iterator();
// 对多部件请求资源进行遍历
while (iterator.hasNext()) {
String formKey = (String) iterator.next();
MultipartFile multipartFile = multipartRequest.getFile(formKey);
String filename = multipartFile.getOriginalFilename();
String ext = filename.substring(filename.lastIndexOf(".") + 1, filename.length());
// 判断是否为限制文件类型
if (!checkMime(ext)) {
throw new VegaException("File type '" + ext + "' unsupport.");
}
}
}
}
}
return true;
}
/**
* 判断是否为允许的上传文件类型
*/
private boolean checkMime(String ext) {
if (this.allowMimes.contains(ext.toLowerCase())) {
return true;
}
return false;
}
}
FileUploadInterceptor
最新推荐文章于 2024-06-21 14:32:54 发布