springmvc通过MultipartResolver获取文件

一、springmvc中配置multipartResolver

<bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8"/>
        <!-- 文件大小最大值 -->
        <property name="maxUploadSize" value="10485760000"/>
        <!-- 内存中的最大值 -->
        <property name="maxInMemorySize" value="1024"/>
        <property name="uploadTempDir" value="temp/tomcat"/>
    </bean>
二、如果在后台Controller的java的获取为:
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
MultipartFile file = multipartRequest.getFile("file");
String a1 = multipartRequest.getParameter("a1");

是获取到到文件的。

(一):
1、在spring-config配置了<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 之后

后台的获取有两种方法:

1、指定@RequestParam MultipartFile file 例如:public Map<String, Object> logsUpload(@RequestParam MultipartFile file,@RequestParam(value="key") String key)参数;

2、将request转化为MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)(request);

原理是:使用spring的CommosMultipartResolver 配置MultipartResolver 用于文件上传,DispatcherServlet 将调用 MultipartResolver 的 isMultipart(request) 方法检查当前 Web 请求是否为 multipart类型。如果是,DispatcherServlet 将调用 MultipartResolver 的 resolveMultipart(request) 方法,对原始 request 进行装饰,并返回一个 MultipartHttpServletRequest 供后继处理流程使用(最初的 HttpServletRequest 被偷梁换柱成了 MultipartHttpServletRequest),否则,直接返回最初的 HttpServletRequest。也就是说请求一旦被 MultipartResolver 接手,它就会解析请求中的文件,而不必等待后续 controller 主动从 MultipartRequest 中 getFile,所以在配置了MultipartResolver后,再通过这样的方法

MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);

是获取不到file的,因为控制器已经帮我们进行了转换 直接获取即可。

如果你使用该方法发觉获取没有问题,你可以看看给这个方法是不是配置了servlet,如果配置了servlet是不走这个 MultipartResolver控制,是能获取成功的。

三、如果在过滤器中拦截

扫描二维码关注公众号,回复: 2661269 查看本文章

request通过ParameterRequestWrapper可以将获取文件

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

    HttpServletRequest req= (HttpServletRequest) request;
    req.setCharacterEncoding(AppConstants.UTF_8);
    /*
        paramsMap是获取req里面的参数,并将参数进行各种转换后重新封装到req中
    */
    req = new ParameterRequestWrapper(req, paramsMap);
    chain.doFilter(req,resp);

}
public class ParameterRequestWrapper extends HttpServletRequestWrapper {

    private Map params;

    public ParameterRequestWrapper(HttpServletRequest request, Map newParams) {
        super(request);
        this.params = newParams;
        if (request instanceof MultipartHttpServletRequest) {
            MultipartHttpServletRequest mReq = (MultipartHttpServletRequest) request;
            mReq.setAttribute(HttpConstants._request_files, mReq.getFileMap());
        }
    }

    public Map getParameterMap() {
        return params;
    }

    public Enumeration getParameterNames() {
        Vector l = new Vector(params.keySet());
        return l.elements();
    }

    public String[] getParameterValues(String name) {
        Object v = params.get(name);
        if (v == null) {
            return null;
        } else if (v instanceof String[]) {
            return (String[]) v;
        } else if (v instanceof String) {
            return new String[] { (String) v };
        } else {
            return new String[] { v.toString() };
        }
    }

    public String getParameter(String name) {
        Object v = params.get(name);
        if (v == null) {
            return null;
        } else if (v instanceof String[]) {
            String[] strArr = (String[]) v;
            if (strArr.length > 0) {
                return strArr[0];
            } else {
                return null;
            }
        } else if (v instanceof String) {
            return (String) v;
        } else {
            return v.toString();
        }
    }
}

controller层中:

Map<String, MultipartFile> chatfileList = (Map<String, MultipartFile>) 
request.getAttribute(HttpConstants._request_files);
Set<String> filekey = chatfileList.keySet();
for(Iterator<String> iteror = filekey.iterator();iteror.hasNext();){
    MultipartFile chatfile = chatfileList.get(iteror.next());
    String fileName = "";
   
    fileName = chatfile.getOriginalFilename();
    System.out.println("-------------------ss:" + fileName);
    String relativePath = "/data/file";
     File fileRoot = new File(relativePath);
     if (!fileRoot.exists()) {
        fileRoot.mkdir();
      }
    String fileNewName = ".png");

            File fileServer = new File(fileRoot.getPath(), fileNewName);
            chatfile.transferTo(fileServer);
}
注意:下面获取不到文件
MultipartHttpServletRequest mReq = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> chatfileList= mReq.getFileMap();

因为经过ParameterRequestWrapper转换后,request直接是获取不到multipartFiles了

参考资料:
1、spring的multipartResolver和java后端获取的MultipartHttpServletRequest方法对比 (附:遇到的坑)

猜你喜欢

转载自blog.csdn.net/tuantuanyua/article/details/81352897