暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SpringBoot项目里用MultipartFile作为入参获取到的file为什么null

全栈的程序员 2022-08-11
1818


前言:

  最近在项目中用到了Excel模板导入功能,但是在测试阶段用Postman测试时,通过Post请求,传到后端的File一直为null。其中前端传参和请求都没问题,后端的接参也没问题,问题出在过滤器的复用上。


问题场景:

    前端上传模板,导入excel做批量新增。入参为File。


问题原因:

    是项目中加了过滤器导致的,过滤器是为了request重复使用,但是文件请求类型multipart/form-data和其他类型不一样,所以过滤器没法处理导致进不了Controller。


原过滤器配置

    @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    ServletRequest requestWrapper = null;
    if (requestinstanceof HttpServletRequest) {
    requestWrapper = new RequestWrapper((HttpServletRequest) request);
    }




    if (null == requestWrapper) {
    filterChain.doFilter(servletRequest, response);
    } else {
    filterChain.doFilter(requestWrapper, response);
    }
    }

    修改过滤器将其改成兼容模式

          @Override
      public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {


      HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
      String contentType = httpServletRequest.getContentType();
      //判断请求类型
      if (contentType == null) {
      //表单请求
      filterChain.doFilter(servletRequest, servletResponse);
      return;
      } else if (contentType.startsWith("multipart/")) {
      //文件上传类型
      filterChain.doFilter(servletRequest, servletResponse);
      return;
      } else if (contentType.startsWith("application/json")) {
      //json请求
      ServletRequest requestWrapper = null;
      if (servletRequest instanceof HttpServletRequest) {
      requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);
      }




      if (null == requestWrapper) {
      filterChain.doFilter(servletRequest, servletResponse);
      } else {
      filterChain.doFilter(requestWrapper, servletResponse);
      }
      }


      }


      问题排查:

          网上的解决方式众说纷云,都是再说后端入参的接参不对。要加@RequestParam(“file”)或者@RequestPart(“file”) 再或者 @RequestBody。其实这些都没有用,而且 加上@RequestParam(“file”)注解就报Requied request part ‘file’ is not present错误。如果在确定前端正确传参,后端正确接参的情况下。依然 为null。很容易就联想到是中间联络初出问题了,那就在过滤器和拦截器之前找问题。一看过滤器没有兼容multipart/form-data就定位了。这种问题不设置过滤器是复现不出来的,一旦加了没有做兼容就会有问题。


      用两张图说明

      Interceptor拦截器,Filter过滤器,给大家科普下,万一不知道名词是啥呢。



      文章转载自全栈的程序员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论