解决spring boot 上传文件时 MultipartFile null问题


在接手其他同事的项目时,为系统加入文件上传功能,出现的问题。后论坛中论坛中找到解决办法,是引用 commons-fileupload查看,重写multipartResolver实现文件上传,因为其他系统无需特殊配置就可以实现文件上传,所有继续寻找问题根源,发现项目中 dispatcherRegistration配置引起的问题

项目版本信息如下

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

 

文件上传大小限制配置

spring.servlet.multipart.max-request-size=100MB
spring.servlet.multipart.max-file-size=100MB

 

文件上传前端使用的layui的上传插件,具体代码如下

function initUpdataPdf() {
    layui.use(['form', 'element', 'table', 'layer', 'laydate', 'upload'], function () {
        var form, element, layer;
        form = layui.form
            , element = layui.element
            , table = layui.table
            , layer = layui.layer
            , upload = layui.upload;

        var $ = layui.jquery

        var uploadInst = upload.render({
            elem: '#addPdfButton'
            , url: contextPath + 'documents/uploadPdf'
            , accept: 'file' //只允许pdf文件
            , acceptMime: 'file/pdf' //只允许pdf文件
            , size: 100 * 1024 //限制文件大小,单位 KB
            , field: 'file'
            , before: function (obj) {
                //预读本地文件示例,不支持ie8
                obj.preview(function (index, file, result) {
                    layer.msg('上传中...', {icon: 16, shade: [0.5, '#f5f5f5'], scrollbar: false, time: 100000});
                });
            }
            , done: function (res) {
                layer.closeAll()
                //如果上传失败
                if (isNotEmpty(res) && isNotEmpty(res.code) && res.code == 0) {
                    layer.msg('上传成功!');
                    initPagination();
                } else {
                    return layer.msg('上传失败');
                }
            }
        });
        form.render();
    });
}

  

后台Controller 文件接收代码

@PostMapping("/attInfo/uploadPdf")
    @ResponseBody
    public Map uploadPdf(@RequestParam("file") MultipartFile file) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 0);
        map.put("msg", "");


        Integer code = 0;
        String msg = "";
        String name = file.getOriginalFilename();
        File fileBean = new File(fileBasePathProperties.getTmpFileBasePath() + name);
        String id = "";


        try {
            file.transferTo(fileBean);
           
            id = saveProductsAttInfo.getAttId();

            map.put("code", 0);
        } catch (IOException e) {
            map.put("code", 1);
            map.put("msg", "保存错误");
            e.printStackTrace();
        }
        map.put("id", id);
        map.put("name", name);

        return map;
    }

解决办法 1:取自网络

 第一步:在pom.xml中加入以下代码

 

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.8.0</version>
        </dependency>

第二步:加入配置类

@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);
        //上传文件大小 50M 50*1024*1024
        resolver.setMaxUploadSize(50 * 1024 * 1024);
        return resolver;
    }

}

第三步:在启动类上修改注解

@SpringBootApplication(exclude={MultipartAutoConfiguration.class})

 

 

解决办法 2

我的项目中去掉以下配置即可,若没有以下配置,需要自行查找servlet相关的配置

@Bean
    public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
        ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet);
        registration.addUrlMappings("/*");
        return registration;
    }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM