springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显

简介: 本文介绍了在Spring Boot中如何实现文件上传,包括单文件和多文件上传的实现,文件上传的表单页面创建,接收上传文件的Controller层代码编写,以及上传成功后如何在页面上遍历并显示上传的文件。同时,还涉及了`MultipartFile`类的使用和`@RequestPart`注解,以及在`application.properties`中配置文件上传的相关参数。

项目结构及pom.xml

在这里插入图片描述

pom.xml:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
AI 代码解读

创建文件表单页面

文件表单要求其 form标签中method="post" enctype="multipart/form-data",然后多文件表单的话,可以通过<input type="file" multiple> multiple属性来声明这是一个多文件控件。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>文件表单上传</title>
</head>
<body>

<form th:action="@{/upload}" method="post" enctype="multipart/form-data">
    邮箱:<input type="text" name="email"><br>
    账号:<input type="text" name="idCard"><br>
    头像:<input type="file" name="head_portrait"><br>
    其他文件上传<input type="file" multiple name="fileLists"><br>
    <input type="submit" value="上传"><br>
</form>
</body>
</html>
AI 代码解读

编写javabean

package com.robin.boot.bean;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.ArrayList;

@ToString
@NoArgsConstructor
@AllArgsConstructor
@Data
public class MyFileUpLoad {
   
    // 封装javabean,用于success.html页面遍历数据
    private String email;
    private String idCard;
    private String headImg;
    private String[] names;
}
AI 代码解读

编写controller映射

MultipartFile类

在Spring框架中提供了MultipartFile来处理文件上传的文件。MultipartFile类是org.springframework.web.multipart包下面的一个类,MultipartFile主要是用表单的形式进行文件上传,在接收到文件时,可以获取文件的相关属性,比如文件名、文件大小、文件类型等等。

MultipartFile类,提供了很多方法供我们使用,如下图:

在这里插入图片描述

@RequestPart注解

@RequestPart主要用来处理content-type为 multipart/form-data 或 multipart/mixed stream 发起的请求,可以获取请求中的参数,包括普通文本、文件或复杂对象比如json、xml等,针对json等复杂对象,需要明确对应的content-type。

使用时在@RequestPart(“xxx”),通过file表单控件的name值,即可获取对应元素的内容。

controller代码

获取上传的表单文件和普通控件的值,并将其存放于当前项目的静态资源下的uploadCaches文件夹中,同时如果上传成功的话,将上传的数据封装到javabean中,然后使用model将其发送至请求域中。

tip:这里图片上传的时候,封装到javabean中的是它的上传文件名,所以待会儿遍历时,使用img标签就可以看到上传的图片了。

使用MultipartFile类中提供的transferTo()方法可以直接将上传的文件保存到指定的位置中,getOriginalFilename()方法用于获取上传文件的文件名称。

package com.robin.boot.controller;

import com.robin.boot.bean.MyFileUpLoad;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

@Slf4j
@Controller
public class FormTestController {
   

    // 获取文件上传表单
    @RequestMapping("/upload")
    public String upload(@RequestParam("email") String email,
                         @RequestParam("idCard") String idCard,
                         @RequestPart("head_portrait") MultipartFile head_portrait,
                         @RequestPart("fileLists") MultipartFile[] fileLists,
                         Model model) throws IOException {
   
        // 输出日志信息
        log.info("email{},idCard{},head_protrait_size{},fileLists_length{}",
                email,idCard,head_portrait.getSize(),fileLists.length);

        String headImg = "";
        // 保存上传的文件到当前项目的 static 目录下
        if(!head_portrait.isEmpty()){
   
            // 获取上传的头像的名字
            headImg = "uploadCaches\\"+head_portrait.getOriginalFilename();
            // 保存到 static目录中的 uploadCaches目录下
            head_portrait.transferTo(new File("D:\\IdeaProjects\\demoUpload\\src\\main\\resources\\static\\"+headImg));
        }

        // 多文件名数组
        String[] names = new String[fileLists.length];

        // 保存多文件。一边遍历一边保存
       if (fileLists.length>0){
   
           for (int i = 0; i < fileLists.length; i++) {
   
               if(!fileLists[i].isEmpty()){
   
                   // 与上面单个文件保存的方法一样
                   String filename = "uploadCaches\\"+fileLists[i].getOriginalFilename();
                   names[i] = filename;
                   fileLists[i].transferTo(new File("D:\\IdeaProjects\\demoUpload\\src\\main\\resources\\static\\"+filename));
               }
           }
       }

        // 创建javabean对象
        MyFileUpLoad myFileUpLoad = new MyFileUpLoad(email,idCard,headImg,names);
        // 跳转视图,并且封装数据到Model中
        model.addAttribute("msg","保存成功!");
        model.addAttribute("myFileUpLoad",myFileUpLoad);
        return "success";
    }
}
AI 代码解读

application.properties中的文件上传配置

可以通过spring.servlet.multipart.max-file-sizespring.servlet.multipart.max-request-size来设定服务器接受的文件上传的最大值。

    spring.servlet.multipart.max-file-size=10MB
    spring.servlet.multipart.max-request-size=20MB
AI 代码解读

遍历数据显示页面

使用thymeleaf的 th:each 以及 th:textth:src将请求域中的数据获取,并且渲染到页面中。需要注意的是,thymeleaf的for-each遍历item:${Lists}其子项${item.xxx}...,要求其中的item.xxx,xxx必须是和javabean中的字段名对应,而不是和model发送请求时的字段名保持一致。


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>success</title>
</head>
<body>
    <h3 th:text="${msg}">title</h3>
    <div th:each="item:${myFileUpLoad}">
        邮箱:<span th:text="${item.email}">xxx</span><br>
        账号:<span th:text="${item.idCard}">xxx</span><br>
        头像:<img th:src="${item.headImg}"></img><br>
        其他文件:
        <p th:each="nameItem:${item.names}">
            <img th:src="${nameItem}" style="width: 240px;height: 240px"></img><br>
        </p>
    </div>

</body>
</html>
AI 代码解读

运行显示

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


目录
打赏
0
1
1
0
83
分享
相关文章
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
29 3
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
247 0
|
4月前
|
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
128 0
|
4月前
|
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
358 0
SpringBoot整合Flowable【06】- 查询历史数据
本文介绍了Flowable工作流引擎中历史数据的查询与管理。首先回顾了流程变量的应用场景及其局限性,引出表单在灵活定制流程中的重要性。接着详细讲解了如何通过Flowable的历史服务API查询用户的历史绩效数据,包括启动流程、执行任务和查询历史记录的具体步骤,并展示了如何将查询结果封装为更易理解的对象返回。最后总结了Flowable提供的丰富API及其灵活性,为后续学习驳回功能做了铺垫。
320 0
SpringBoot整合Flowable【06】- 查询历史数据
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
1142 43
SpringBoot 2.0 多图片上传加回显
本文记录了在SpringBoot 2.0中实现商户注册后台功能时,处理多图片上传及回显的过程。通过使用`MultipartFile[]`接收前端传来的图片文件,并确保前后端参数名一致。展示了Controller、前端HTML和JS代码,以及配置文件中对上传图片大小的设置。还介绍了全局异常处理机制,使用`@ControllerAdvice`注解捕获异常。最后总结了一些常见问题及解决方法。
108 0
SpringBoot 2.0 多图片上传加回显
SpringBoot整合Flowable【05】- 使用流程变量传递业务数据
本文介绍了如何使用Flowable的流程变量来管理绩效流程中的自定义数据。首先回顾了之前的简单绩效流程,指出现有流程缺乏分数输入和保存步骤。接着详细解释了流程变量的定义、分类(运行时变量和历史变量)及类型。通过具体代码示例展示了如何在绩效流程中插入全局和局部流程变量,实现各节点打分并维护分数的功能。最后总结了流程变量的使用场景及其在实际业务中的灵活性,并承诺将持续更新Flowable系列文章,帮助读者更好地理解和应用Flowable。 简要来说,本文通过实例讲解了如何利用Flowable的流程变量功能优化绩效评估流程,确保每个环节都能记录和更新分数,同时提供了全局和局部变量的对比和使用方法。
453 0
SpringBoot整合Flowable【05】- 使用流程变量传递业务数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
224 9
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问