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

news2024/11/28 5:33:21

springboot文件上传,单文件上传和多文件上传

  • 项目结构及pom.xml
  • 创建文件表单页面
  • 编写javabean
  • 编写controller映射
    • MultipartFile类
    • @RequestPart注解
    • controller代码
  • 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>

创建文件表单页面

文件表单要求其 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>

编写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;
}

编写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";
    }
}

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

遍历数据显示页面

使用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>

运行显示

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

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL用法详解补充

本文是对上次“SQL用法详解”的一些补充&#xff0c;一些基本操作可以点击链接查看 目录 一.对表结构的常用操作 查看表结构格式 修改表结构格式 1.修改列名和类型 2.修改添加列 3.修改表删除列 4.修改表名 5.数据删除 二.总结 三.实例 解决 完整代码 一.对表结构的常用操…

TIA博途中启用或禁用DP从站或PROFINET IO设备的具体方法

TIA博途中启用或禁用DP从站或PROFINET IO设备的具体方法 在实际项目中我们会遇到这样的问题, 例如:硬件组态中配置了一个控制器和3个 PN IO设备,但是最后只用到了2个PN IO设备,这样控制器一侧无法连接到第3个PN IO设备时,CPU会产生报警,PLC的Error指示灯会一直闪烁。 那么…

蓝桥杯2021省赛Python

蓝桥杯2021省赛Python 不得不说2021的比2020的难 1.卡片 很明显&#xff0c;最先没的肯定是1或者0&#xff0c;我们只要统计到谁会消耗2022个1或者0就好了 if __name__ __main__:res1 0res0 0for i in range(1,100000):i str(i)res1 i.count(1)res0 i.count(0)if res1…

[Rust笔记] 规则宏的“卫生保健”

规则宏代码的“卫生保健”规则宏mbe即是由macro_rules!宏所定义的宏。它的英文全称是Macro By Example。相比近乎“徒手攀岩”的Cpp模板元编程&#xff0c;rustc提供了有限的编译时宏代码检查功能&#xff08;名曰&#xff1a;Mixed Hygiene宏的混合保健&#xff09;。因为rust…

pointcovn 阅读笔记

各种点云采样算法 https://blog.csdn.net/weixin_41485242/article/details/107150963 Inverse Density 1.2 Inverse Density Importance Sampling (IDIS): 这个也比较好理解&#xff0c;简而言之就是根据每个点的密度来对其重新进行排序&#xff0c;尽可能地保留密度比较低的地…

python第九章 异常笔记

和Java类似程序运行有异常的时候&#xff0c;服务器会采用系统默认的异常处理机制&#xff1a;返回信息&#xff0c;终止程序。异常的类型&#xff1a;常见异常类型&#xff1a;1.NameError&#xff1a;访问了未定义的变量2.IndexError&#xff1a;越界访问3.AttributeError&am…

网络原理-网络发展史和通信基础

目录 1.网络发展史 面向终端的计算机网络 计算机网络阶段(局域网LAN) 组网方式 计算机网络互联阶段(广域网WAN) 2.通信基础 IP地址 端口号 网络协议 协议的作用 知名协议的默认端口 协议分层 分层的作用 OSI七层模型 TCP/IP五层模型 网络设备所在分层 网络分层…

《数据结构》八大排序和拓展的排序(详细教学并提供多种版本、动态图分析)

今天&#xff0c;我将带来数据结构的排序算法&#xff0c;排序算法作为校招中常考知识点之一&#xff0c;我们必须要熟练的掌握它,对自己提出高要求&#xff0c;才能有高回报。 目录排序的概念和应用内部排序和外部排序排序算法需要掌握的知识插入排序1.直接插入排序2.希尔排序…

【教程】Python实时检测CPU和GPU的功耗

目录 前言 GPU功耗检测方法 CPU功耗检测方法 sudo的困扰与解决 完整功耗分析示例代码 转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 前言 相关一些检测工具挺多的&#xff0c;比如powertop、powerstat、s-tui等。但如何通过代码的方式来实时检测&#xf…

Unsafe Fileupload-基础篇(文件上传绕过技巧与upload-labs靶场)

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 文件上传基础 01 什么是文件上传 02 文件上传产生漏洞的原因 03 文件上传漏洞危害 0…

济人药业更新招股书:计划在A股上市,中成药业务收入持续下滑

近日&#xff0c;安徽济人药业股份有限公司&#xff08;下称“济人药业”&#xff09;递交预披露更新招股书&#xff0c;准备在上海证券交易所主板上市。据贝多财经了解&#xff0c;济人药业于2022年7月1日递交上市申请&#xff0c;此次更新了截至2022年6月30日的财务数据等信息…

Android深入系统完全讲解(42)

红色部分 pc 000007cc 代表当前 pc 指向的位置。libnative-lib.so 代表在哪个库里面。于是我 们就需要知道&#xff0c;libnative-lib.so 库的 pc 000007cc 偏移位置&#xff0c;是个什么代码。 我们从 NDK 开发包中找到 D:\android-ndk-r19c\toolchains\arm-linux-androideabi…

远程控制软件

远程控制软件1. 概述2. TeamViewer3. Todesk4. 向日葵5. AnyDesk6. Splashtop结束语1. 概述 出门在外或者工作时突然需要访问家中的电脑拿取文件或者资料时&#xff0c;是直接跑回家拿去、还是委托家里人员帮忙呢&#xff1f; 这时候你就需要一类软件来完成这个任务了&#xf…

前端图片压缩方案及代码实现

1. 为什么要进行图片压缩? 随着互联网的发展&#xff0c;图片在各种网站和应用中铺天盖地&#xff0c;运营人员在后台管理系统中上传图片时常常忽略的图片的体积大小&#xff0c;随之产生的带宽和服务器容量也大大增加&#xff0c;图片压缩的需求随之产生。 常见的压缩图片的…

【笔记】SemGCN

一. 论文总结 1.1 核心贡献 提出了一种改进的图卷积操作&#xff0c;称为语义图卷积(SemGConv)&#xff0c;它源自cnn。其关键思想是学习图中暗示的边的信道权值&#xff0c;然后将它们与核矩阵结合起来。这大大提高了图卷积的能力。其次&#xff0c;我们引入了SemGCN&#x…

GPU服务器上跑深度学习模型

1 问题来源 近期在本地 Windows 系统上跑深度学习人群计数模型时&#xff0c;由于笔记本 NVIDIA 显卡 NVIDIA GeForce GTX 1650 的专用 GPU 内存只有 4 GB&#xff0c;无法设置较大的 batchsize 进行训练&#xff0c;导致模型训练时间过长&#xff0c;且易发生内存溢出&#xf…

年初五,迎财神 | 一张码如何实现多渠道(微信、支付宝、云闪付...)收款

大家好&#xff0c;我是小悟 今天是正月初五&#xff0c;天气超级好&#xff0c;也是迎财神的日子&#xff0c;祝大家顺风顺水&#xff0c;财源滚滚&#xff0c;钱兔似锦。 既然要发财&#xff0c;那自然少不了收款咯。如果你是一个商家&#xff0c;肯定是想收款的方式越方便越…

【手写 Promise 源码】第三篇 - 实现一个简版 Promise

一&#xff0c;前言 上一篇&#xff0c;结合示例介绍了 Promise 相关功能与特性分析&#xff0c;包含以下内容&#xff1a; Promise 基础特性&#xff1b;Promise 实例 API&#xff08;原型方法&#xff09;&#xff1b;Promise 静态 API&#xff08;类方法&#xff09;&…

【数据结构】极致详解:树与二叉树(中)——顺序存储实现

目录 &#x1f4d4;前言&#x1f4d4;&#xff1a; &#x1f4d9;一、顺序存储结构&#x1f4d9;&#xff1a; &#x1f4d8;二、堆&#x1f4d8;&#xff1a; 1.堆的概念及结构&#xff1a; 2.堆的性质&#xff1a; 3.堆的实现&#xff08;本文重点&#xff09;&#xf…

离线用户召回定时更新系列二

3.6.3 特征处理原则 离散数据 one-hot编码连续数据 归一化图片/文本 文章标签/关键词提取embedding3.6.4 优化训练方式 使用Batch SGD优化 加入正则化防止过拟合 3.6.5 spark LR 进行预估 目的&#xff1a;通过LR模型进行CTR预估步骤&#xff1a; 1、需要通过spark读取HIVE外…