美文网首页技术干货
springMvc 完美解决 multipart/form-da

springMvc 完美解决 multipart/form-da

作者: 激流勇进杨怼怼 | 来源:发表于2019-03-29 13:29 被阅读57次
    前段时间处理上传文件时遇到了一些问题 multipart/form-data 方式提交的请求 在无法用 Filter中用 ServletRequest.getParameter 方

    法取不到一并提交上来的 参数,

    • 网上说 需要使用 ServletRequest.getReader() 方法 来获取请求信息(RequestPayload), 然后在解析字符串来获取想要的参数。
    • 但是! ServletRequest.getReader() 只能获取一次,如果在拦截其中 取出了requestPayload ,那么在spring的 controller 中 你将取不到参数和文件了!!!!!
      摸索到了这里我发现这是走了弯路, 既然 springMVC 的接口中可以获取到 参数,那说明 spring 已经很好的解决了这个问题 咱们就不要自己造轮子了;
    寻找方案:通过查看mvc的源码 果然 发现了两个类,
    1. 实现了、 ServletRequest的 org.springframework.web.multipart.MultipartHttpServletRequest.java 类 (这个类的 getParameter 方法可以获取到 multipart/form-data 和 非multipart/form-data 方法上传的 参数)

    2. 用于创建 MultipartHttpServletRequest.java 的 org.springframework.web.multipart.MultipartResolver.java 类

    使用方法
    1. 首先在你的spring配置文件中 配置 MultipartHttpServletRequest
    <bean id="multipartResolver"
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
            p:defaultEncoding="UTF-8">
            <property name="maxUploadSize">
                <value>104857600</value>
            </property>
            <property name="maxInMemorySize">
                <value>4096</value>
            </property>
    </bean>
    
    1. 在你的拦截其中 注入 MultipartHttpServletRequest
    // 用于创建MultipartHttpServletRequest
    private MultipartResolver multipartResolver = null;
    
    @Override
    public void init(FilterConfig arg0) throws ServletException {
    // 注入bean
        multipartResolver = ((MultipartResolver)ApplicationContextUtil.getContext().getBean("multipartResolver", MultipartResolver.class));
    }
    
    
    1. 在你的最顶层的 拦截器中 把你的 ServletRequest 替换成 MultipartHttpServletRequest
            /**
         * 获取 request
         * @param req
         * @return
         */
        private ServletRequest getRequest(ServletRequest req){
            String enctype = req.getContentType();
            if (StringUtils.isNotBlank(enctype) && enctype.contains("multipart/form-data"))
                // 返回 MultipartHttpServletRequest 用于获取 multipart/form-data 方式提交的请求中 上传的参数
                return multipartResolver.resolveMultipart((HttpServletRequest) req);
            else 
                return req;
        }
    
    1. 把 用上面 2.3的 getRequest(req) 获取到的 MultipartHttpServletRequest 交给 chain.doFilter(MultipartHttpServletRequest, resp); 让请求继续执行(这时使用获取到的 MultipartHttpServletRequest.getParameter 方法就能正常获取参数了)。 之后的所有拦截器和controller也都能继续get参数了

    相关文章

      网友评论

        本文标题:springMvc 完美解决 multipart/form-da

        本文链接:https://www.haomeiwen.com/subject/uzrlbqtx.html