FileUploadInterceptor

本文介绍了一种文件上传拦截器的设计方案,该拦截器能够控制最大上传文件大小,并验证文件类型,确保上传文件符合预设的安全标准。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值