【SpringBoot】18 上传文件到数据库(Thymeleaf + MySQL)

Git仓库

https://gitee.com/Lin_DH/system

介绍

使用 Thymeleaf 写的页面,将(txt、jpg、png)格式文件上传到 MySQL 数据库中。

依赖

pom.xml

        <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency>

数据库配置

application.yml

spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: rootpassword: rootmybatis-plus:type-aliases-package: com.lm.system.commonmapper-locations: classpath:com.lm.system/mapper/*Mapper.xmlcheck-config-location: trueconfiguration:#日志实现,不配置不会输出SQL日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

SQL

t_file.sql

/*Navicat Premium Data TransferSource Server         : localhostSource Server Type    : MySQLSource Server Version : 50734Source Host           : localhost:3306Source Schema         : systemTarget Server Type    : MySQLTarget Server Version : 50734File Encoding         : 65001Date: 18/10/2024 15:14:51
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for t_file
-- ----------------------------
DROP TABLE IF EXISTS `t_file`;
CREATE TABLE `t_file`  (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`format` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,`data` longblob NOT NULL,`size` double NOT NULL,`create_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0),PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

实现代码

第一步:编写上传页面

uploadToBD.html

<!DOCTYPE html>
<html lang="en">
<head lang="en"><meta charset="UTF-8" /><title>文件上传到数据库页面</title>
</head>
<body>
<h1>文件上传到数据库页面</h1>
<form method="post" action="/uploadToDB" enctype="multipart/form-data">请选择要上传的txt/jpeg/png格式文件:<input type="file" name="file"><br><hr><input type="submit" value="提交">
</form>
</body>
</html>

第二步:编写文件实体类

SysFile.java

package com.lm.system.common;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;/*** @author DUHAOLIN* @date 2024/10/17*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SysFile {@TableId(value = "id", type = IdType.INPUT)private Integer id;private String name;private String format;private byte[] data;private long size;private Date createTime;}

第三步:编写dao层接口

SysFileMapper.java

package com.lm.system.mapper;import com.baomidou.dynamic.datasource.annotation.DS;
import com.lm.system.common.SysFile;/*** @author DUHAOLIN* @date 2024/10/17*/
//@DS("system")
public interface SysFileMapper {int insertFile(SysFile file);}

第四步:编写dao层SQL

SysFileMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lm.system.mapper.SysFileMapper"><resultMap id="beans" type="com.lm.system.common.SysFile"><id property="id" column="id" jdbcType="INTEGER" /><result property="name" column="name" jdbcType="VARCHAR" /><result property="format" column="format" jdbcType="VARCHAR" /><result property="data" column="data" jdbcType="BLOB" /><result property="size" column="size" jdbcType="DOUBLE" />    <result property="createTime" column="create_time" jdbcType="TIMESTAMP" /></resultMap><insert id="insertFile" parameterType="com.lm.system.common.SysFile">INSERT INTO t_file (NAME, FORMAT, DATA, SIZE)VALUES (#{name}, #{format}, #{data}, #{size})</insert></mapper>

第五步:添加 controller

FileController.java

import com.lm.system.exception.FileException;
import com.lm.system.mapper.SysFileMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.List;/*** @author DUHAOLIN* @date 2024/10/15*/
@Controller
public class FileController {@Resourceprivate SysFileMapper fileMapper;private final static String FILE_FORMAT_TXT = "txt";private final static String FILE_FORMAT_JPEG = "jpg";private final static String FILE_FORMAT_PNG = "png";@Value("${file.upload.path}")private String path;private void checkFile(MultipartFile file, String[] fileFormats) {//校验文件大小checkSize(file.getSize());//校验文件名checkFilename(file.getOriginalFilename());//校验文件格式checkFileFormat(file.getOriginalFilename(), fileFormats);}private void checkSize(long size) {if (size > 10485760L) //10MBthrow new FileException("文件大于10MB");}private void checkFilename(String filename) {if (!StringUtils.hasText(filename))throw new FileException("文件名有误");}private void checkFileFormat(String filename, String[] fileFormats) {int i = filename.lastIndexOf(".");String suffix = filename.substring(i + 1); //文件后缀long c = Arrays.stream(fileFormats).filter(s -> s.equals(suffix)).count(); //判断是否存在该文件后缀if (c < 1) throw new FileException("文件格式有误,该文件类型为:" + suffix);}@GetMapping("uploadToDBPage")public String uploadToDBPage() {return "uploadToDB";}@PostMapping("uploadToDB")@ResponseBodypublic String uploadToDB(@RequestParam("file") MultipartFile file) throws IOException {//校验文件try {String[] fileFormats = { FILE_FORMAT_TXT, FILE_FORMAT_JPEG, FILE_FORMAT_PNG };checkFile(file, fileFormats);} catch (FileException e) {e.printStackTrace();return e.getMessage();}//构建存储对象SysFile sysFile = SysFile.builder().name(getFilename(file.getOriginalFilename())).format(getFileFormat(file.getOriginalFilename())).data(file.getBytes()).size(file.getSize()).build();int i = fileMapper.insertFile(sysFile);return i > 0 ? "添加成功" : "添加失败";}private String getFileFormat(String filename) {int i = filename.lastIndexOf(".");return filename.substring(i + 1); //文件后缀}/*** 获取不带后缀的文件名*/private String getFilename(String originalFilename) {int i = originalFilename.lastIndexOf(".");return originalFilename.substring(0, i);}}        

第六步:配置默认 tomcat 最大吞吐量

application.yml

server:port: 8888  tomcat:max-swallow-size: 100MB #tomcat的最大吞吐量,默认为2MB,-1则为不限制spring:application:name: systemservlet:multipart:max-file-size: 10MB #默认为1MB      max-request-size: 10MB #默认为10MB

上传大于配置文件设定的文件后,页面无响应。
在这里插入图片描述
添加上 tomcat 最大吞吐量配置,则能够正常返回。
在这里插入图片描述
存在全局异常捕获的可以把文件最大文件限制异常捕获的也加上。

GlobalExceptionHandler.java

     @Value("${spring.servlet.multipart.max-file-size}")private String maxFileSize;@ResponseStatus(HttpStatus.BAD_REQUEST)@ExceptionHandler({MaxUploadSizeExceededException.class})public String handleMaxUploadSizeException(Exception e, HttpServletRequest request) {log.error("400-上传文件超过最大限制{},{},{}", maxFileSize, e.getMessage(), request.getServletPath());e.printStackTrace();return ResultBody.build(HttpStatus.BAD_REQUEST).setMsg("上传文件超过最大限制" + maxFileSize).getReturn();}

效果图

txt

上传 txt 格式文件,添加成功。
在这里插入图片描述

jpg

上传 jpg 格式文件,添加成功。
在这里插入图片描述

png

上传 png 格式文件,添加成功。
在这里插入图片描述

csv

上传允许格式之外的格式文件,如 csv 文件,则页面返回“文件格式有误”,上传失败。
在这里插入图片描述

项目结构图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手动搭建 Ghost 博客

操作场景 Ghost 是使用 Node.js 语言编写的开源博客平台&#xff0c;您可使用 Ghost 快速搭建博客&#xff0c;简化在线出版过程。本文档介绍如何在腾讯云云服务器&#xff08;CVM&#xff09;上手动搭建 Ghost 个人网站。 进行 Ghost 网站搭建&#xff0c;您需要熟悉 Linux …

类型转换指令及方法调用与返回指令

我的后端学习大纲 JVM学习大纲 4.类型转换指令&#xff1a; 类型转换指令说明 ①类型转换指令可以将两种不同的数值类型进行相互转换。 这些转换操作一般用于实现用户代码中的显式类型转换操作&#xff0c;或者用来处理字节码指令集中数据类型相关指令无法与数据类型一一对应的…

【LLM Agents体验 3】利用Open-WebUI+Ollama本地部署Qwen2.5:7B大模型的安装指南

Open WebUI是一种基于 Web 的用户界面&#xff0c;用于管理和操作各种本地和云端的人工智能模型。它提供了一个直观的图形化界面&#xff0c;使用户可以方便地加载、配置、运行和监控各种 AI 模型&#xff0c;而无需编写代码或使用命令行界面。 Open-WebUI 是一款功能强大且易于…

动态规划 —— dp 问题-买卖股票的最佳时机IV

前言 在开始之前先说一下本题与 买卖股票的最佳时机Ill 的解法很相似&#xff0c;也可以去参考lll 动态规划 —— dp 问题-买卖股票的最佳时机III-CSDN博客https://blog.csdn.net/hedhjd/article/details/143671809?spm1001.2014.3001.5501 1. 买卖股票的最佳时机IV 题目链接&…

软件测试学习记录 Day1

根据黑马程序员最新版的软件测试课程所做的笔记&#xff0c;需要原件后台私信&#xff1a; 练习提取测试点&#xff1a; 博主的答案&#xff0c;有不一样看法的可评论区讨论&#xff1a;

Kafka 快速入门(一)

1.1安装部署 1.1.1 集群规划 bigdata01bigdata02bigdata03zookeeperzookeeperzookeeperkafkakafkakafka 1.1.2 集群部署 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html 检查三台虚拟机的zk是否启动&#xff1a;zkServer.sh start 默认启动方式 1)解压…

wordpress实用功能A5资源网同款 隐藏下载框 支付框 需要登录才能查看隐藏的内容

实用功能 隐藏下载框 支付框 需要登录才能查看隐藏的内容, 个人网站防天朝申查实测有效 。 登录前&#xff0c;未登录&#xff1a; 登录后&#xff0c;已登录&#xff1a; 功能说明 该代码段的主要功能是隐藏支付框并为未 登录用户显示一条提示信息&#xff0c;告知他们需要…

SQL HAVING子句

SQL 是一种基于“面向集合”思想设计的语言。HAVING 子句是一个聚合函数&#xff0c;用于过滤分组结果。 1 实践 1.1 缺失的编号 图 连续编号记录表t_seq_record 需求&#xff1a;判断seq 列编号是否有缺失。 SELECT 存在缺失的编号 AS res FROM t_seq_record HAVING COUN…

TCP可靠连接的建立和释放,TCP报文段的格式,UDP简单介绍

TCP连接的建立&#xff08;三次握手&#xff09; 建立连接使用的三报文 SYN 报文仅用于 TCP 三次握手中的第一个和第二个报文&#xff08;SYN 和 SYN-ACK&#xff09;&#xff0c;用于初始化连接的序列号。数据传输阶段不再使用 SYN 标志。 SYN 报文通常只携带连接请求信息&a…

【量化交易笔记】14.模拟盘效果

说明 距离上一篇的量化文章有一段时间&#xff0c;应小伙伴要求&#xff0c;继续写下去&#xff0c;我思考了一下&#xff0c;内容有很多&#xff0c;绝大多数是研究的过程&#xff0c;并且走的是弯路&#xff0c;分享了怕影响大伙&#xff0c;之前因为行情不好&#xff0c;研…

FPGA实现以太网(二)、初始化和配置PHY芯片

系列文章目录 FPGA实现以太网&#xff08;一&#xff09;、以太网基础知识 文章目录 系列文章目录一、MDIO协议介绍二、PHY芯片管脚以及结构框图三、MDIO帧时序介绍3.1 MDIO帧格式3.2 MDIO写时序3.3 MDIO读时序 四、PHY芯片常用寄存器描述4.1 基本模式控制寄存器&#xff08;0…

【韩老师零基础30天学会Java 】06章 数组、排序和查找

第六章 数组、排序和查找 1. 数组&#x1f6a9;&#x1f6a9; 数组介绍&#xff1a; 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。即:数组就是一组数据。 示例&#xff1a; double [] hens{3,5,1,3,4,2,50,7.8,88.8,1.1,5}; double totalWe…

基于Zynq FPGA对雷龙SD NAND的测试

文章目录 SD NAND特征SD卡简介1.2 SD卡块图 SD卡样片Zynq测试平台搭建测试流程SOC搭建软件搭建 测试结果总结 SD NAND特征 SD卡简介 雷龙的SD NAND有很多型号&#xff0c;在测试中使用的是CSNP4GCR01-AMW与CSNP32GCR01-AOW。芯片是基于 NAND FLASH 和 SD控制器实现的SD卡。具…

在Linux上部署(MySQL Redis Elasticsearch等)各类软件

实战章节&#xff1a;在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面&#xff0c;我们学习了许多的Linux命令和高级技巧&#xff0c;这些知识点比较零散&#xff0c;同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用&#xff0c…

电脑不显示wifi列表怎么办?电脑不显示WiF列表的解决办法

有用户会遇到电脑总是不显示wifi列表的问题&#xff0c;但是不知道要怎么解决。随着无线网络的普及和使用&#xff0c;电脑无法显示WiFi列表的问题有时会让人感到困扰。电脑不显示WiFi列表是很常见的问题&#xff0c;但这并不意味着你无法连接到网络。不用担心&#xff0c;这个…

Android中Activity启动的模式

在 Android 开发中&#xff0c;Activity 的启动模式&#xff08;Launch Mode&#xff09;定义了当启动一个 Activity 时&#xff0c;系统会如何处理它的实例。不同的启动模式可以影响 Activity 在任务栈中的管理方式&#xff0c;对用户的使用体验产生直接影响。下面详细介绍四种…

Xshell 7 偏好设置

1 Xshell7 工具——更改用户数据文件夹 就是此电脑目录下的文档 该目录下的7 Xshell下的 applog ColorScheme Files 配色方案文件目录 HighlightSet Files 突出显示集目录 Logs 日志 QuickButton Files 快速命令集 Scripts 脚本文件 Sessions 会话文件 会话文件目录就…

丹摩征文活动 | 丹摩智算:大数据治理的智慧引擎与实践探索

丹摩DAMODEL&#xff5c;让AI开发更简单&#xff01;算力租赁上丹摩&#xff01; 目录 一、引言 二、大数据治理的挑战与重要性 &#xff08;一&#xff09;数据质量问题 &#xff08;二&#xff09;数据安全威胁 &#xff08;三&#xff09;数据管理复杂性 三、丹摩智算…

企业级容器技术docker之一键生成 Docker Compose

案例: 一键生成 Docker Compose 利用网站将docker 命令自动生成 Docker Compse Composerizehttps://www.composerize.com/ 基于docker-compose编译多服务镜像并启动容器案例 输入docker命令就可以自动转换为 docker-compose的格式

C++《stack与queue》

在之前的章节我们学习了C当中string、vector和list三种容器并且试着模拟实现这三种容器&#xff0c;那么接下来在本篇当中我们将STL当中的stack和queue&#xff0c;并且在学习stack和queue的使用之后和之前一样还会试着模拟实现stck和queue。由于stck和queue的模拟实现较为简单…