完美处理SpringMVC文件上传的一系列问题(无法获取参数、断点、分片等)

来源:互联网 发布:算法还是编码 编辑:程序博客网 时间:2024/06/07 00:27

问题1 使用@RequestParam或者用request.getParameter无法获取参数的问题

这个问题就是由于multipart/form-data这种上传方式引起的问题,会造成二进制数据

如何解决

resolver1:愚蠢的方法

在表单提交的form的action后面直接附加?param=param的形式,简单粗暴,但是某些业务场景不允许这么做

tips:onSubmit="return validate();"是表单提交前的回调方法

resolver2:繁琐的方法

修改成自定义的mutipartResolver

<bean id="multipartResolver" class="com.common.web.MyMultipartResolver"><!-- url中带有uploadAttach1的http请求就不会被multipartResolver先解析--><property name="excludeUrls" value="uploadAttach1,officeServer"/><property name="maxUploadSize" value="${web.maxUploadSize}" /></bean>
public class MyMultipartResolver extends CommonsMultipartResolver {    private String excludeUrls;       private String[] excludeUrlArray;        public String getExcludeUrls() {        return excludeUrls;    }    public void setExcludeUrls(String excludeUrls) {        this.excludeUrls = excludeUrls;        this.excludeUrlArray = excludeUrls.split(",");    }    /**     * 这里是处理Multipart http的方法。如果这个返回值为true,那么Multipart http body就会MyMultipartResolver 消耗掉.如果这里返回false     * 那么就会交给后面的自己写的处理函数处理例如刚才ServletFileUpload 所在的函数     * @see org.springframework.web.multipart.commons.CommonsMultipartResolver#isMultipart(javax.servlet.http.HttpServletRequest)     */    @Override    public boolean isMultipart(HttpServletRequest request) {        for (String url: excludeUrlArray) {            // 这里可以自己换判断            if (request.getRequestURI().contains(url)) {                return false;            }        }                return super.isMultipart(request);    }     }
//如果是Multipart上传则是文件信息if (ServletFileUpload.isMultipartContent(request)){try {DiskFileItemFactory factory = new DiskFileItemFactory();factory.setSizeThreshold(1024);ServletFileUpload upload = new ServletFileUpload(factory);upload.setHeaderEncoding("UTF-8");List<FileItem> items = upload.parseRequest(request);for(FileItem item : items){
//item文本域
if(item.isFormField()){if(item.getFieldName().equals("name")){fileName =  new String(item.get(),"UTF-8");}else if(item.getFieldName().equals("chunk")){
使用fileupload中的方法,防止被mutipartResolver过滤,直接判断文件域和文本域

比较繁琐

resovler3:看代码

ShiroHttpServletRequest shiroRequest = (ShiroHttpServletRequest) request;CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();MultipartHttpServletRequest multipartRequest = commonsMultipartResolver.resolveMultipart((HttpServletRequest) shiroRequest.getRequest()); String aa = multipartRequest.getParameter("aa");
这里集成了shiro所以要这么处理下下

有意思吧,只要按照任意一种处理方式,都可以完美解决此问题



0 0