Springboot结合前端上传图片保存到数据库读取

2023-11-05

前言

最近在做一个前后端分离系统,也是闲的无聊做个好玩的练练手。就突然想着之前想了一天的问题,前端怎么去发送图片到后端保存(不是专业前端,轻点喷),图片到底是保存在本地还是存在oss上,保存图片的方式又是什么,这些问题想到我头皮发麻。最后,还是花了一下午的时间写出来了个半成品(最后一步没保存到数据库,后期更新)。
首先我们先来看看效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
虽说界面有点丑,但是也还将就吧。
接下来就直接把代码贡献给各位(后期改进点击图片上传)

思路

前端包装一个FormData参数,发送给后端接收,后端定义好实体类和文件,数据交互使用ajax,页面跳转使用Ajax,数据传递使用session。网页展示中,使用FileReader来实时预览。
可能有人问,为什么不用base64编码去保存图片信息,不为什么,因为我不喜欢。。(其实是太长了,每次测试都眼花)

实体类

由于这里是测试,所以我就定义了三个,用户名-username、密码-password、文件名-imgName

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user") // 忽略这里,还没连接数据库。。。
public class Info {
    private Integer id;
    private String username;
    private String password;
    private String imgName;
}
前端登录层
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <script th:src="@{style.js}"></script>
</head>
<body>
<form id="form-data">
    用户名:<input type="text" name="username" placeholder="用户名"><br>
    密码:<input type="password" name="password" placeholder="密码"><br>
    头像:<input type="file" accept="*/*" name="file" id="FileImg" onchange="xmTanUploadImg(this)">
    <img src="" alt="默认头像地址(可以自己填)" id="avarimgs" style="border-radius: 50%" width="200px" height="200px">
    <input type="button" value="注册" id="registerBtn" onclick="reg()">
</form>

</body>
</html>
function xmTanUploadImg(obj) {
    var file = obj.files[0];
    console.log("obj:" + obj);
    console.log("file:" + file);
    console.log("fileName:" + file.name)
    console.log("file.size = " + file.size);
    var reader = new FileReader();
    reader.onload = function (e) {
        console.log(e)// ProgressEvent 对象,里面的target.result就是base64编码
        console.log("成功读取....");
        var img = document.getElementById("avarimgs");
        img.src = e.target.result;
        //或者 img.src = this.result;  //e.target == this
    }
    reader.readAsDataURL(file)
}

function reg() {
    let form = new FormData($("#form-data")[0])
    console.log(form)
    $.ajax({
        //接口地址
        url: 'submit',
        type: 'POST',
        data: form,
        async: false,
        cache: false,
        contentType: false,
        processData: false,
        success:function (data) {
            console.log(data)
            console.log(data.imgName);
            sessionStorage.setItem("img_name",data.imgName);
            window.location='/info'
        }
    });
}
后端控制层
@Controller
@ResponseBody
public class FileController {

    @RequestMapping(value = "/submit", method = RequestMethod.POST)
    public Info submit(MultipartFile file,Info info)
            throws Exception {
        //这里就可以获取里面的上传过来的数据了
        //做一些存库操作,以及返回的数据
        String filename = file.getOriginalFilename();
        System.out.println(filename);
        String filePath = System.getProperty("user.dir")+"\\src\\main\\resources\\static\\img";
        if (!new File(filePath).exists()){
            new File(filePath).mkdirs();
        }
        File dest = new File(filePath + File.separator + info.getUsername()+"_"+filename);
        try {
            file.transferTo(dest);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(info);
        info.setImgName(info.getUsername()+"_"+filename);
        return info;
    }
}

我在后端由于要保存用户头像,所以命名为了防止冲突,直接暴力的使用用户名加上图片文件名进行保存,这样可以很大程度上保证用户的头像唯一(或者在登录的时候直接加一个判断,先保证用户名在数据库中唯一,因为我自己在设计的时候用的主要是一个别名而不是用户名,所以我就没有加)
保存目录不能直接写死路径,假如你的项目需要部署在服务器上,那么就会直接报找不到文件的错误。所以我借用了MyBatis-plus的写法,用了当前系统目录;

踩的坑
在测试的时候,由于第一次上传上去之后图片不能立即显示,需要重启服务器。这个坑折磨了我半个小时,最后看了一眼网上大佬们的做法,加一个资源映射就完美的解决了。确实,这个很nice。所以我也给大家:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        System.out.println("图片配置生效");
        String filePath = System.getProperty("user.dir")+"\\src\\main\\resources\\static\\img\\";
        System.out.println(filePath);
        registry.addResourceHandler("/img/**").addResourceLocations("file:"+filePath);
    }
}

依赖问题
很简答,我没用什么很花里胡哨的操作。如果你是直接复制这个demo的话,只需要加一个thymeleaf就行,配置文件不用谢任何东西。

这个也是缠了我好几天的问题了,我i也终于解决了,啊,爽
在这里插入图片描述
最后给一张结构图,仅供参考:
在这里插入图片描述
如果对你有帮助,请尽情留下你的评论和点赞,我不会嫌弃的哦。
如果哪儿有值得改进的地方,也请告诉我,我会马上加以改进;

谢谢你这么忙还来看我的文章,靓仔!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot结合前端上传图片保存到数据库读取 的相关文章

随机推荐

  • Filco键盘问题

    垃圾中的垃圾 垃圾中的战斗机 先按键盘的最左边重置 红蓝灯交替 直到蓝灯长时间闪烁 第一种 如果从 蓝牙和其他设备 添加时 提示需要输入PIN码 果断换方式 第二种 从 控制面板 添加设备 开始 可以会自动出现一串数字 迅速在filco设备
  • 【Java文件流】你的“转换流、对象流、打印流、Properites”学习资料

    在我学习Java的IO流过程中 有很多的类 每个类又有很多方法 经过我的几天经历 在看懂 听懂了别人的讲解后 一定要自己去敲出来 在IDE中运行出来 在一定程度上才算了解了这个东西 尝试 牢牢把握 心中有数 类与接口之间的继承 实现关系 只
  • malloc的底层实现原理

    目录 基于Linux操作系统malloc申请内存的实现原理 1 malloc分配内存前的初始化 2 下为malloc init 代码 3 内存块的获取 1 内存块的大致结构 2 寻找合适的block 3 扩容 4 内存分配 下为内存分配代码
  • make: execvp Permission denied\\ make Error 127解决办法

    出现错误make make execvp coff2noff coff2noff Permission denied Makefile 36 recipe for target add noff failed make add noff E
  • vue3,vue2导出表格中的数据,导出excel格式

    vue3 vue2导出表格中的数据 导出excel格式 引入npm包 xlsx 0 18 5 import as XLSX from xlsx async function exportExcel if itemsquan value it
  • 基于小程序的理发店预约系统

    一 项目背景及简介 现在很多的地方都在使用计算机开发的各种管理系统来提高工作的效率 给人们带来很多的方便 计算机技术从很大的程度上解放了人们的双手 并扩大了人们的活动范围 是人们足不出户就可以通过电脑进行各种事情的管理 信息系统的出现是人类
  • c语言土壤墒情监测系统,土壤墒情监测系统是什么,它的作用都是什么

    随着现代农业的不断发展 土壤墒情监测系统的使用越来越广泛 不仅如此 其它的农用仪器也越来越受欢迎 例如杀虫灯等植保器械 大家基本上都能够接受 因为它所带来的效果是实实在在能够看到的 而对于监测土壤墒情等仪器来说 目前人们还处在徘徊的阶段 正
  • Python数据可视化——折线图

    第1关 折线图的绘制与优化 本关任务 利用世界银行发布的 1960 2009 年间的世界人口数据 来学习折线图的绘制 coding utf 8 import pandas as pd 用于生成满足绘图要求的数据格式 import numpy
  • golang-面试题(选择题)

    1 初级 下面属于关键字的是 A func B def C struct D class 参考答案 AC 2 初级 定义一个包内全局字符串变量 下面语法正确的是 A var str string B str C str D var str
  • 4.2.8 Kafka 延时队列, 重试队列(结合redis实现)

    目录 2 7 延时队列 2 8 重试队列 代码实现 Kafka 高级特性 延时 重试队列 2 7 延时队列 两个follower副本都已经拉取到了leader副本的最新位置 此时又向leader副本发送拉取请求 而leader副本并没有新的
  • 第十七课,帧缓存(创建和使用方法)

    OpenGL允许我们定义我们自己的帧缓冲 也就是说我们能够定义我们自己的颜色缓冲 甚至是深度缓冲和模板缓冲 创建一个帧缓冲 1 创建一个帧缓冲对象 Framebuffer Object FBO 创建语法同VAO VBO unsigned i
  • C#实现DLT直接线性变换(Direct Linear Transform)算法

    C 实现DLT直接线性变换 Direct Linear Transform 算法 参考资料 1 武大版 工业测量技术与数据处理 P100 P106 2 转载博文 MATLAB实现DLT Direct Linear Transform 算法
  • 蓝桥杯每日一题(15):莱布尼茨计算圆周率(python)

    Topic 历史上有许多计算圆周率pai的公式 其中 格雷戈里和莱布尼茨发现了下面的公式 pai 4 1 1 3 1 5 1 7 参见图 这个公式简单而优美 但美中不足 它收敛的太慢了 如果我们四舍五入保留它的两位小数 那么 累积1项是 4
  • android Q支持的EAP方法配置

    1 supplicant external wpa supplicant 8 wpa supplicant android config CONFIG EAP MD5 y CONFIG EAP MSCHAPV2 y CONFIG EAP T
  • HTML <thead> 标签

    实例 带有 thead tbody 以及 tfoot 元素的 HTML 表格 table border 1 thead tr th Month th th Savings th tr thead tfoot tr td Sum td td
  • Tomcat多实例和负载均衡动静分离

    目录 一 Tomcat多实例部署 二 负载均衡动静分离 2 1 动静分离 2 11 nginx负载均衡 192 168 30 203 2 22 Tomcat服务器 192 168 30 200 2 23 Tomcat服务器 192 168
  • java g1垃圾收集器_深入理解G1垃圾收集器

    G1 GC是Jdk7的新特性之一 Jdk7 版本都可以自主配置G1作为JVM GC选项 作为JVM GC算法的一次重大升级 DK7u后G1已相对稳定 且未来计划替代CMS 所以有必要深入了解下 不同于其他的分代回收算法 G1将堆空间划分成了
  • Ubuntu22.10 安装微信方法

    Ubuntu22 10 安装微信方法 Ubuntu操作系统中 我尝试过用wine方式安装数次都没有能够启动成功 方法如下 在Ubuntu上安装微信需要使用Wine Wine是一款可以在Linux系统上运行Windows应用程序的兼容层 以下
  • 修改redis配置文件重新启动redis服务启动不了

    一 迁移一个新的配置文件 cat redis conf grep v grep v gt redis test conf 二 修改redis test conf配置 三 启动 redis server etc redis test conf
  • Springboot结合前端上传图片保存到数据库读取

    前言 最近在做一个前后端分离系统 也是闲的无聊做个好玩的练练手 就突然想着之前想了一天的问题 前端怎么去发送图片到后端保存 不是专业前端 轻点喷 图片到底是保存在本地还是存在oss上 保存图片的方式又是什么 这些问题想到我头皮发麻 最后 还