springBoot上传文件时MultipartFile报null 空 问题解决方法

2023-11-05

1.问题描述:

之前用spring MVC,转成spring boot之后发现上传不能用。网上参考说是spring boot已经有CommonsMultipartResolver了,但是我的上传后台接收的还是null。

2.第一种解决方法

加入配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;


@Configuration
public class UploadConfig {
    //显示声明CommonsMultipartResolver为mutipartResolver
    @Bean(name = "multipartResolver")
    public MultipartResolver multipartResolver() {
        CommonsMultipartResolver resolver = new CommonsMultipartResolver();
        resolver.setDefaultEncoding("UTF-8");
        //resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
        resolver.setResolveLazily(true);
        resolver.setMaxInMemorySize(40960);
        //上传文件大小 5M 5*1024*1024
        resolver.setMaxUploadSize(5 * 1024 * 1024);
        return resolver;
    }

}

在springboot启动类上加入注解

//排除原有的Multipart配置
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
public class Application extends SpringBootServletInitializer {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

 

特别注意Controller接收的时候一定要加上@RequestParam,否则不可用,如下所示:

@RequestParam("file") MultipartFile multipartFile

 

 

第二种方法:注(请自行搜索您项目中Filter的拦截类,以下针对自己的项目中的请求)

如果说还是不行就可能项目中的file拦截器做了http请求处理或者做了请求转化,如果是因为这个下面解决方式重写方法

package com.wl.partner.aspect;
import com.cre.dmp.osp.app.gateway.RequestWrapper;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 此类为一个切面类,主要作用就是对接口的请求进行拦截
 * 注:废弃{拦截的方式,只需要在指定接口方法上面加上@MonitorRequest注解即可}
 * chufangbo
 * 2020-09-28
 */
@Aspect
@Component
@WebFilter(
        urlPatterns = {"*"},
        filterName = "tokenAuthorFilter"
)
public class RequestAspect implements Filter{
//    /**
//     * 表示在执行被@MonitorRequest 会执行doBefore()方法
//     *
//     * @param joinPoint 连接点,就是被拦截点
//     */
//    @Before(value = "@annotation(com.wl.partner.aspect.MonitorRequest)")
//    public void doBefore(JoinPoint joinPoint){
//        System.out.println("--------------表示在执行被@MonitorRequest 会执行doBefore()方法--------------------");
//            //获取到请求的属性
//        ServletRequestAttributes attributes =
//                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        //获取到请求对象
//        HttpServletRequest request = attributes.getRequest();
//        //URL:根据请求对象拿到访问的地址
//        urlGl=request.getRequestURL().toString();
//        logger.info("url=" + request.getRequestURL());
//        //获取请求的方法,是Get还是Post请求
//        logger.info("method=" + request.getMethod());
//        //ip:获取到访问
//        logger.info("ip=" + request.getRemoteAddr());
//        //获取被拦截的类名和方法名
//        logger.info("class=" + joinPoint.getSignature().getDeclaringTypeName() +
//                "and method name=" + joinPoint.getSignature().getName());
//        //参数
//        logger.info("参数=" + joinPoint.getArgs().toString());
//        //方法内部类即嵌套在方法里面
//    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest servletRequest1 = (HttpServletRequest) servletRequest;
        String requestURI = servletRequest1.getRequestURI();
        //TODO URL:根据请求对象拿到访问的地址(放开导入拦截) 此处需要配置项目路径的具体方法
//        List<String> passlist = new ArrayList<>();
//        passlist.add("/wl-ltx-partner-api/excelAllController/importCityManagerDealer");
//        passlist.add("/wl-ltx-partner-api/partnerController/importPartner");
        ServletRequest requestWrapper = null;
        if (!requestURI.contains("/wl-ltx-partner-api/excelAllController")) {
        //if (!passlist.contains(requestURI)) {
            requestWrapper = new RequestWrapper((HttpServletRequest)servletRequest);
        }
        if (requestWrapper == null) {
            System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>开始进入自定义导入:重写doFilter 跳过内置getWay拦截{HttpServletFilter}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
            StandardMultipartHttpServletRequest standardMultipartHttpServletRequest = new StandardMultipartHttpServletRequest((HttpServletRequest) servletRequest);
            filterChain.doFilter(standardMultipartHttpServletRequest, servletResponse);
        } else {
            //System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>走内置com.cre.dmp.osp.app.gateway.filter【getWay】拦截{HttpServletFilter}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
            filterChain.doFilter(requestWrapper, servletResponse);
        }
    }
}

 

如果说还是不行请查询日志打印的请求拦截处理

跳过:&& !execution(* com.wl.partner.controller.ExcelAllController.*(..))  拦截

package com.wl.partner.aspect;


import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 全局日志打印--liuling
 */
@Component
@Aspect
@Slf4j
public class LogAspect {
    //跳过导入导出的controller&& !execution(* com.wl.partner.controller.ExcelAllController.*(..))
    @Pointcut("execution(public * com.wl.partner.controller..*.*(..)) && !execution(* com.wl.partner.controller.ExcelAllController.*(..))")
    public void webLog() {
    }
    
    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 记录下请求内容
        if (joinPoint.getArgs().length>0) {
            if (joinPoint.getArgs()[0] instanceof HttpServletResponse) {
                if (joinPoint.getArgs().length > 1) {
                    log.info("-------------------------------------收到请求 --> " + request.getRequestURL().toString() + ":" + JSONObject.toJSONString(joinPoint.getArgs()[1]));
                } else {
                    log.info("-------------------------------------收到请求 --> " + request.getRequestURL().toString());
                }
            } else {
                log.info("-------------------------------------收到请求 --> " + request.getRequestURL().toString() + ":" + JSONObject.toJSONString(joinPoint.getArgs()[0]));
            }

        }

    }
    
    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        log.info("-------------------------------------返回参数--> : " + JSONObject.toJSONString(ret));
    }
    
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springBoot上传文件时MultipartFile报null 空 问题解决方法 的相关文章

  • 预置APK到android系统中(带源码/不带源码)

    一 如何将带源码的APK预置进系统 1 首先将app代码放在源码中 1 1 可以放在vendor 目录下自己项目的package app 下面 1 2 可以放在vendor google partner gms apps 或者 vendor
  • 服务器数据库查看版本信息失败,查看服务器上的数据库版本

    查看服务器上的数据库版本 内容精选 换一换 升级PostgreSQL引擎大版本 能让您享受到PostgreSQL新版本带来的功能 性能 安全的提升 但大版本升级可能存在向后不兼容的数据变更 可能导致现有业务运行不兼容 因此需要用户使用目标版
  • 程序中断方式

    系统设置程序中断的目的就是能让系统处理更高等级的任务 比如紧急事件 对系统有改动的更高权限的任务 因为CPU 是计算机中处理任务的核心 程序中断在CPU中设立 外设和程序中端分别是由中端控制器和程序内置的中断服务程序配合操作系统来决定 使操
  • 计算机硬件acc作用,累加器A的主要作用是什么_一文解析累加器a和acc的区别

    累加器简介 在中央处理器中 累加器 accumulator 是一种寄存器 用来储存计算产生的中间结果 如果没有像累加器这样的寄存器 那么在每次计算 加法 乘法 移位等等 后就必须要把结果写回到内存 也许马上就得读回来 然而存取主存的速度是比

随机推荐

  • 【微信小程序】微信小程序支付、微信小程序webview引入H5实现支付等

    最近有个需要由于H5页面需要嵌套在微信小程序里面 所以H5的支付在小程序里面就行不通了 不过我看社区里面说的测试环境微信小程序webview引入H5是可以实现调取H5支付功能的 线上则调不起来 时间紧迫 咱也不敢尝试啊 只能另辟蹊径了 哈哈
  • vs2013+qt5.9.5+vsaddin安装配置

    一 下载地址 Qt下载地址 https mirrors tuna tsinghua edu cn qt archive qt 5 9 5 9 5 qt opensource windows x86 5 9 5 exehttps mirror
  • 【安全开发】C/C++安全编码规范

    C本质上是不安全的编程语言 例如如果不谨慎使用的话 其大多数标准的字符串库函数有可能被用来进行缓冲区攻击或者格式字符串攻击 但是 由于其灵活性 快速和相对容易掌握 它是一个广泛使用的编程语言 下面是针对开发安全的C语言程序的一些规范 1 1
  • windows11百度网盘下载,win11iso镜像百度云下载

    windows11百度网盘下载 win11iso镜像百度云 windows11百度网盘下载 win11iso镜像百度云链接 https pan baidu com s 1r96WDwsDURdrRt1nl Z0PQ 提取码 6666 上面是
  • 在vant组件下阻止手机自带键盘弹起

    废话 van field输入框伴随着小键盘的弹起 但是在已经定义了的van popup中 小键盘的弹起显得多余 尤其在地区 籍贯等的选择上 所以利用 focus 在获取焦点的时候进行阻止 代码
  • 局域网配置网站DNS服务器的安装

    小提示 要想成功部署DNS服务 运行Windows Serve 2003的计算机中必须拥有一个静态IP地址 只有这样才能让DNS客户端定位DNS服务器 另外如果希望该DNS服务器能够解析Internet上的域名 还需保证该DNS服务器能正常
  • STM32单片机示例:多个定时器级联使用

    文章目录 目的 基础说明 关键配置与代码 示例链接 目的 有些情况下会遇到单片机的定时器位数不够用 这时候可以使用低定时器级联的方式来处理 这里将对此做个示例说明 基础说明 这里说的定时器级联是指一个定时器正常计数工作 然后在发生溢出时发送
  • PYthon 转换HTML到Text纯文本

    今天项目需要将HTML转换为纯文本 去网上搜了一下 发现Python果然是神通广大 无所不能 方法是五花八门 拿今天亲自试的两个方法举例 以方便后人 方法一 1 安装nltk 可以去pipy装 注 需要依赖以下包 numpy PyYAML
  • AT24C02的使用说明和完整代码-51单片机

    AT24C02的使用说明和完整代码 51单片机 简述 at24c02为存储器芯片 可以使用单片机将数据存入其中 同时也可以任意读取 at24c02的原理及使用方法在其说明资料中已有充分的讲述 本篇仅对其使用的关键步骤进行罗列 以及说明一下具
  • MySQL主从复制的实现

    MySQL主从复制的理解图 MySQL Replication原理 主从复制 也称 AB 复制 允许将来自一个MySQL数据库服务器 主服务器 的数据复制到一个或多个MySQL数据库服务器 从服务器 复制是异步的 从站不需要永久连接以接收来
  • React中文文档之Lifting State Up

    Lifting State Up 提升状态 经常的 几个组件需要映射相同的数据改变 我们推荐提升共享的state状态到它们最近的公共祖先元素 让我们看看这是如何实现的 在这个章节 我们将创建一个温度计算器 计算在一个给定的温度 水是否会沸腾
  • 20200331 --【Python】-- selenium 登录练习

    学习 python 的第59天 模拟腾讯课堂 自动化 登录案例 简单 coding utf 8 Time 2020 3 31 10 52 Author admin Site File 腾讯课堂登录 py Software PyCharm i
  • Allegro显示飞线和隐藏飞线

    隐藏飞线 显示飞线
  • C++ 标准库中数据类型转换

    头文件引用
  • 延迟队列的方案设计

    延迟队列的实现方案 一 应用场景 什么是延时队列 顾名思义 首先它要具有队列的特性 再给它附加一个延迟消费队列消息的功能 也就是说可以指定队列中的消息在哪个时间点被消费 延时队列在项目中的应用场景是比较多的 尤其像电商类平台 1 订单成功后
  • 基于js利用经纬度进行两地的距离计算

    根据地球上两点之间的经纬度计算两点之间的直线距离 经纬度到距离的计算在通信工程中应用比较广泛 所以cosbeta通过搜索找到了一个js的计算脚本 其实是google map的计算脚本 应该算是比较准确了 做成了这个经纬度算距离的工具 今天有
  • 全到哭,阿里新产2023版Java架构核心宝典,涵盖Java进阶所有主流技术

    导言 什么是架构师 对于程序员来说 聊架构是一个永不过时的话题 实际上 每一家公司都有自己对架构师不同的定位 因为不同的公司 所处的阶段 业务模式以及应用场景都不一样 因此对架构师的要求不一样 所以定位也就不同 但是 无论如何 架构师除了优
  • STM32------TFTLCD原理

    目录 TFTLCD简介 一 知识点 1 TFTLCD驱动原理 ALINETEK TFTLCD模块介绍 2 2 8寸TFLCD模块特点 3 TFTLCD模块原理图 4 TFTLCD接口说明 5 并口驱动简介 6 ILI9341驱动时序 7 驱
  • 过滤器使用与bean注入

    1 web xml中各元素启动顺序 在项目启动时 监听器listener最先初始化 然后是过滤器filter 最后是servlet Spring监听器在启动时会读取spring配置文件 进行spring容器的初始化 springMVC的di
  • springBoot上传文件时MultipartFile报null 空 问题解决方法

    1 问题描述 之前用spring MVC 转成spring boot之后发现上传不能用 网上参考说是spring boot已经有CommonsMultipartResolver了 但是我的上传后台接收的还是null 2 第一种解决方法 加入