附件上传大小限制-拦截器方法
2016-08-24 09:39
267 查看
项目中的一个新需求,要求对于XXXX模块下的附件上传,附件允许最大不超过10M;而项目最早是通过Spring的配置文件做的全局限制,附件上传限制最大是5M;如果现在通过修改Spring的配置文件来扩大maxUploadSize,将会导致全系统的附件上传都发生了改变。
暂且想到的解决方案:采用拦截器的方式处理,对于附件上传的请求进行拦截处理,其它请求不做处理。对于特殊的附件上传,在请求中加入特定的标识,以便对附件大小做控制;也可以通过判断附件上传请求的路径来判断控制。
1、原项目的全局配置文件
3、UploadFileInterceptor类
4、config.xml配置文件
暂且想到的解决方案:采用拦截器的方式处理,对于附件上传的请求进行拦截处理,其它请求不做处理。对于特殊的附件上传,在请求中加入特定的标识,以便对附件大小做控制;也可以通过判断附件上传请求的路径来判断控制。
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>
相关文章推荐
- 修改WordPress中上传附件2M大小限制的方法
- 修改WordPress中上传附件2M大小限制的方法
- 修改WordPress中上传附件2M大小限制的方法/php+iis上传附件默认大小修改方法
- .NET附件上传大小限制控制
- .NET附件上传大小限制控制
- 修改在Windows2003中上传的附件大小的限制
- 修改windows2003下IIS6默认上传文件大小限制(200K)的方法
- 修改IIS6上传文件限制,下载附件大小限制
- ASP.Net文件上传研究之二——一种更高效的限制上传文件大小的方法
- 设置IIS6.0的上传文件和下载附件的大小限制
- 论坛上传附件大小限制
- 定制QC工作流,限制上传附件大小
- .net附件文件上传大小限制的问题
- .NET里面附件上传大小限制的控制
- 客户端限制上传文件大小的方法
- 突破IIS6上传文件大小限制的两个方法
- 客户端限制上传文件大小的方法初探
- ASP.NET中用HttpPostedFile.SaveAs(FileName)方法上传文件,文件大小限制
- 修改WIN2003文件上传限制大小200K的解决方法
- smtp发送邮件附件时, 如果文件名过长, 会导致附件乱码, 除了重新编译smtp以外, 限制上传文件名长度就是个简便的方法了.