您的位置:首页 > 其它

附件上传大小限制-拦截器方法

2016-08-24 09:39 267 查看
项目中的一个新需求,要求对于XXXX模块下的附件上传,附件允许最大不超过10M;而项目最早是通过Spring的配置文件做的全局限制,附件上传限制最大是5M;如果现在通过修改Spring的配置文件来扩大maxUploadSize,将会导致全系统的附件上传都发生了改变。
暂且想到的解决方案:采用拦截器的方式处理,对于附件上传的请求进行拦截处理,其它请求不做处理。对于特殊的附件上传,在请求中加入特定的标识,以便对附件大小做控制;也可以通过判断附件上传请求的路径来判断控制。

1、原项目的全局配置文件

<!-- SpringMVC上传附件,需要配置multipartResolver处理器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<!-- 指定所上传附件的总大小不能超过5M -->
<property name="maxUploadSize" value="5000000"/>
<!-- 推迟附件解析,以便在Controller中捕获到附件大小异常 -->
<property name="resolveLazily" value="true"/>
<!-- 文件上传时允许写到内存中的最大值,以字节为单位 -->
<property name="maxUploadSize" value="100000"/>
</bean>
2、采用拦截器方式,加入拦截器配置

<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**">
<bean class="com.sys.common.UploadFileInterceptor"></bean>
</mvc:mapping>
</mvc:interceptor>
</mvc:interceptors>
path="/**" 拦截所有请求,也可以通过该配置拦截指定的请求;bean 配置的class即自定义的拦截器,所有的请求都会被UploadFileInterceptor类给拦截并处理。

3、UploadFileInterceptor类

import java.io.InputStream;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.configuration.CompositeConfiguration;
import org.apache.commons.configuration.XMLConfiguration;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartRequest;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class UploadFileInterceptor extends HandlerInterceptorAdapter{

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{
String backInfoMsg = "";
HttpServletRequest hsr = (HttpServletRequest)request;
MultipartResolver mr = new CommonsMultipartResolver();
//判断请求是否是附件上传的请求
if(mr.isMultipart(hsr)){
MultipartRequest mrequest = (MultipartRequest)hsr;
Map<String, MultipartFile> fileMap = mrequest.getFileMap();
if(null!=fileMap){
MultipartFile file = null;
long uploadFileSize = 0;
long settingFileSize =0;

/** 如果参数不为空,则根据参数查询配置,否则默认限制5M */
String fileSizeParam = hsr.getParameter("fileSizeParam");
if(null!=fileSizeParam && !"".equals(fileSizeParam)){
settingFileSize = Long.valueOf(this.readXml(fileSizeParam)) ;
}else{
settingFileSize = Long.valueOf(this.readXml("fileUpload5M"));
}

for (Map.Entry<String, MultipartFile> multipartFile:fileMap.entrySet()) {
file = multipartFile.getValue();
uploadFileSize += file.getSize(); //累加附件的大小
}

/** 上传附件总大小超出配置时 */
if(settingFileSize < uploadFileSize){
String maxSize = settingFileSize/1000/1000>0?settingFileSize/1000/1000+"M":settingFileSize/1000+"KB";
backInfoMsg = "上传附件大小超过系统限制,最大为:"+maxSize;
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(backInfoMsg);
return false;
}
}
}

return true;
}

/**
* 读取配置文件的内容
* @param key
* @return
* @throws Exception
*/
public String readXml(String key) throws Exception{
String valueStr = null;
InputStream inStr = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.xml");
CompositeConfiguration cc = new CompositeConfiguration();
XMLConfiguration xmlConf = new XMLConfiguration();
xmlConf.load(inStr);
cc.addConfiguration(xmlConf);
valueStr = cc.getString(key);
return valueStr;
}

}
根据请求判断是否是附件上传的请求,如果是则拦截处理,否则不处理。

4、config.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<XmlConfig>
<fileUpload10M>10000000</fileUpload10M>
<fileUpload5M>5000000</fileUpload5M>
</XmlConfig>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: