• Spring Boot上传文件功能的开发


    Spring Boot上传文件功能的开发

    Spring Boot使用Servlet 3的API javax.servlet.http.Part来支持文件上传。Spring Boot在类MultipartAutoConfiguration中定义文件上传组件的自动配置,这个自动配置在使用Spring MVC框架时默认开启。

    3.3.1  POM文件配置

    在开启Web模块时,文件上传功能自动开启,所以pom.xml中只需配置spring-boot-starter- web,配置代码如下:

    <dependency>

      <groupId>org.springframework.boot</groupId>

      <artifactId>spring-boot-starter-web</artifactId>

    </dependency>

    在控制台上,可以通过添加“--debug”启动参数来查看文件上传组件是否已开启。开启时,项目控制台的输出如图3.8所示。

     

    图3.8  控制台输出自动配置开启信息

    3.3.2  参数设置

    在Spring Boot的MultipartProperties类中定义了6个关于文件上传的参数,具体说明如表3.1所示。

    表3.1  文件上传相关参数

    名    称

    默  认  值

    描    述

    spring.servlet.multipart.enabled

    true

    是否开启分段上传,默认为true

    spring.servlet.multipart.file-size-threshold

    0B

    文件写入磁盘的阈值

    spring.servlet.multipart.location

     

    上传文件的临时目录

    spring.servlet.multipart.max-file-size

    1MB

    上传文件最大大小

    spring.servlet.multipart.max-request-size

    10MB

    文件请求最大大小

    spring.servlet.multipart.resolve-lazily

    false

    是否在文件或参数访问时延迟解析多部分请求

    在项目中,可以根据需要在application.yaml中进行配置。在这里,我们使用默认配置。

    3.3.3  编写前端页面

    为了方便访问,在src/main/resources/static目录下创建HTML文件,文件名为file_upload.html。

    在文件中添加一个form表单,用于提交文件,并设置method、action和enctype属性。在该表单内添加两个input,用来选择文件和提交按钮,具体代码如下:

    <!DOCTYPE html>

    <html lang="en">

    <head>

        <meta charset="UTF-8">

        <title>文件上传</title>

    </head>

    <body>

        <form method="POST" action="/upload" enctype="multipart/form-data">

            <input type="file" name="file" />

            <br/>

            <input type="submit" value="提交" />

        </form>

    </body>

    </html>

    这里的method指定了请求类型为POST,请求URL为/upload,下面Controller中的代码要与这些设置相匹配。

    3.3.4  编写处理上传请求的Controller类

    在HTML页面提交会触发请求/upload,因此在服务端需要提供一个处理/upload提交文件的请求,并且将接收到的文件保存到服务器上。在这里将文件保存到D:\files目录下,并且将这个地址作为配置项写到配置文件中。最后,在处理完请求后,请求成功的提示返回给浏览器。具体操作如下:

    (1)在src/main/java/com/example/helloworld/controller目录下新创建一个类,命名为FileUploadController.java,代码如下:

    package com.example.helloworld.controller;

     

    import org.springframework.beans.factory.annotation.Value;

    import org.springframework.stereotype.Controller;

    import org.springframework.web.bind.annotation.PostMapping;

    import org.springframework.web.bind.annotation.RequestParam;

    import org.springframework.web.bind.annotation.ResponseBody;

    import org.springframework.web.multipart.MultipartFile;

     

    import java.nio.file.Files;

    import java.nio.file.Path;

    import java.nio.file.Paths;

     

    @Controller

    public class FileUploadController {

        @Value("${save.path}")

        String savePath;

        @ResponseBody

        @PostMapping("/upload")

        public String upload(@RequestParam("file") MultipartFile file) throws Exception{

            String fileSaveName = System.currentTimeMillis()+"-"+file.getOriginalFilename();

            Path saveTo = Paths.get(savePath,fileSaveName);

            Files.write(saveTo, file.getBytes());

            return fileSaveName+",上传成功!";

        }

    }

    (2)在application.yaml中添加save.path的配置,代码如下:

    save:

      path: D:\files

    3.3.5  从浏览器上传文件

    (1)运行项目,在浏览器中访问http://127.0.0.1:8080/file_upload.html,效果如图3.9所示。

    (2)单击“选择文件”按钮,在弹出的窗口中选择文件。这里已经在桌面的file_upload文件夹中放置了一个Spring标识的图片文件,名为spring_logo.png,选中这个文件,如图3.10所示。

                                           

                               图3.9  文件上传页面                                                                   图3.10  选择文件系统中的图片

    单击打开,页面中显示已选择spring_logo.png,如图3.11所示。

    (3)单击“提交”按钮,浏览器页面自动刷新,显示“...-spring_logo.png,上传成功!”的字样,如图3.12所示。

    这时已经提交成功,并且文件spring_logo.png已经保存到D:\files目录下。打开此目录,可以看到成功保存的文件,如图3.13所示。

          

              图3.11  选中图片后的效果                                               图3.12  上传成功,并显示文件名           图3.13  查看保存的文件

    若多次提交,则这个目录下会保存多个前缀不同的-spring_logo.png文件。

    本书节选自2022年1月出版的《Spring Boot从零开始学(视频教学版)》。

     

  • 相关阅读:
    使用urllib
    spring常用的45个注解
    音痴
    android与JS函数传参遗留问题
    方舟编译器源码过一遍流程
    什么是语义学,解释器
    synchronized,ReentrantLock解决锁冲突,脏读的问题
    【Unity3d】ScrollRect自动定位到某点
    计算点到直线的距离】 C#实现
    理财-房月供占工资多少比较合适?
  • 原文地址:https://www.cnblogs.com/brucexia/p/15904082.html
Copyright © 2020-2023  润新知