当前位置 博文首页 > 逐墨飞扬的博客:SpringBoot文件上传

    逐墨飞扬的博客:SpringBoot文件上传

    作者:[db:作者] 时间:2021-07-12 15:46

    废话不多说,直接上代码。

    添加依赖

    <!-- spring boot web支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- thymeleaf模板引擎依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    
    <!-- 解决Thymeleaf模板代码中如果标签没有关闭报错问题 -->
    <dependency>
        <groupId>net.sourceforge.nekohtml</groupId>
        <artifactId>nekohtml</artifactId>
        <version>1.9.22</version>
    </dependency>
    

    启动类设置

    SpringBootUploadApplication.java

    @SpringBootApplication
    public class SpringBootUploadApplication {
    
        // SpringBoot 2.1版本解决Tomcat最大支持10M文件上传问题
        /*@Bean
        public TomcatServletWebServerFactory tomcatEmbedded() {
            TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
            tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
                if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
                    //-1 means unlimited
                    ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
                }
            });
            return tomcat;
        }*/
    
        // SpringBoot 1.5版本解决Tomcat最大只能上传10M文件问题
        @Bean
        public TomcatEmbeddedServletContainerFactory tomcatFactory() {
            TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
            tomcatFactory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
                if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
                    //-1 为无限制
                    ((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
                }
            });
            return tomcatFactory;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootDemoApplication.class, args);
        }
    
    }
    

    此处设置为了解决上传文件大于10M出现连接重置的问题

    前端页面

    文件上传页面

    upload.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>文件上传</title>
    </head>
    <body>
        <form action="/upload" enctype="multipart/form-data" method="post">
            <input type="file" name="myFile"/>
            <br/>
            <input type="submit"/>
        </form>
    </body>
    </html>
    

    文件上传结果展示页面

    results.html

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8"/>
        <title>结果页</title>
    </head>
    <body>
        <h1 th:text="${msg}">Hello World</h1>
    </body>
    </html>
    

    文件上传Controller层

    UploadController.java

    @Controller
    public class UploadController {
    
        @RequestMapping("/upload")
        public String upload(@RequestParam("myFile") MultipartFile file, Model model) {
            if(file.isEmpty() || "".equals(file.getOriginalFilename().trim())){
                model.addAttribute("msg", "您没有上传文件");
                return "results";
            }
            ApplicationHome applicationHome = new ApplicationHome(getClass());
            // homeDir获取的路径是jar包所在目录的绝对路径(不包含jar包名称)
            File applicationHomeDir = applicationHome.getDir();
            //定义文件上传路径
            File uploadPath = new File(applicationHomeDir, "upload");
            //判断文件上传路径是否存在,若不存在则创建文件路径
            if (!uploadPath.exists()) {
                uploadPath.mkdir();
            }
            //获取完整的文件名(带后缀)
            String originalFileName = file.getOriginalFilename();
            //获取不带后缀的文件名,以最后一个`.`作为标识
            String fileName = originalFileName.substring(0, originalFileName.lastIndexOf("."));
            //获取文件类型,以最后一个`.`作为标识
            String fileType = originalFileName.substring(originalFileName.lastIndexOf(".") + 1);
            //拼接新的文件名,作为上传文件的名称
            String newFileName = fileName + System.currentTimeMillis() + "." + fileType;
            try {
                file.transferTo(new File(uploadPath, newFileName));
                model.addAttribute("msg", "上传成功");
            } catch (IOException e) {
                e.printStackTrace();
                model.addAttribute("msg", "上传失败");
            }
            return "results";
        }
    
    }
    
    cs