数据库存储图片路径并显示到前端

article/2025/10/22 10:30:39

数据库存储图片路径并显示到前端

-为啥不直接存图片:因为图片本身太大了,虽然存取方便了程序员,但对数据库不友好。所以采取存取路径,再根据路径解析的方法。

一、数据库表设计:

从以上思想出发,需要存图片的表的该列就应该是字符串类型(varchar),存的是图片路径(我这里存的是文件名),用字符串拼接方法找到全路径。

二、Controller怎么处理

这里是存进去(insert)的过程,取出来就是一般操作,获取数据库中的路径,就以String传到前端。

    @RequestMapping("/insertDiary.do")public String insertDiary(MultipartFile file, Diary diary, @ModelAttribute("username") String username) throws IOException {//图片上传成功后,将图片的地址写到数据库String filePath = "C:\\Images";//获取原始图片的拓展名String originalFilename = file.getOriginalFilename();//新的文件名字String newFileName = new Date().getTime() + originalFilename;//封装上传文件位置的全路径File targetFile = new File(filePath,newFileName);//把本地文件上传到封装上传文件位置的全路径file.transferTo(targetFile);diary.setStu_username(username);Date date=new Date();java.sql.Date sqlDate=new java.sql.Date(date.getTime());diary.setDiary_time(sqlDate);diary.setAttachment(newFileName);diaryService.insertDiary(diary);return "success";}

重点是以下这段:

        String filePath = "C:\\Images";//获取原始图片的拓展名String originalFilename = file.getOriginalFilename();//新的文件名字String newFileName = new Date().getTime() + originalFilename;//封装上传文件位置的全路径File targetFile = new File(filePath,newFileName);//把本地文件上传到封装上传文件位置的全路径file.transferTo(targetFile);

1、C:\\Images 是我自己创建的用于存储图片的本地文件夹路径。
2、重命名文件名:用字符串拼接方法,保留原名(包括拓展名),然后在其前面加上时间戳,形成独一无二的一长串新文件名。
3、封装全路径:将我创建的文件夹名和新文件名一起作为参数传进File,此时得到的targetFile是一个名为新文件名的file对象。
4、将本地文件上传到封装上传文件位置的全路径(移植过去)
在这里插入图片描述

三、配置

3.1 pom引入文件上传的两个包

    <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.5</version></dependency></dependencies>

3.2 springmvc.xml配置文件上传解析器

没有这个是无法用multipart的

    <!-- 文件上传的解析器 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 上传图片的最大尺寸 10M--><property name="maxUploadSize" value="10485760"></property><!-- 默认编码 --><property name="defaultEncoding" value="utf-8"></property></bean>

四、前端提交表单

4.1 存的jsp

form里一定要加上:
enctype="multipart/form-data"
才可以上传媒体文件!

<form action="${pageContext.request.contextPath}/xxx.do" method="post" enctype="multipart/form-data">

4.2 取的jsp

我是通过jsp中url传参方式将数据传到另一个负责显示的jsp的,所以这里是在jsp先获取数据,再用<%=%>显示数据。(att就是传来的文件名变量)

img标签下src的路径很关键!!!
【如果直接写文件的绝对路径(C:\Images<%=att%>)是无法访问到的】

原因:因为图片是存到了本地文件夹,并没有在项目路径下,所以运行时直接访问图片路径会404.

解决思路:需要在tomcat下有这个文件呀,至少让它知道文件路径在哪->配置虚拟路径

解决方法idea的朋友们看这里:

step1:需要在tomcat配置虚拟路径,映射到本地路径,才能访问到。
找到tomcat下的server.xml文件
在这里插入图片描述
在标签内加上这么一句话:

<Context crossContext="true" debug="0" docBase="C:\Images" path="/imgUrl" reloadable="true"/> 

在这里插入图片描述

docBase是实际的本地路径
path是供读取的路径
即:当读取到/imgUrl时,就会自动将/imgUrl解析成C:\Images,这样就可以根据数据库中的相对路径来拼接出绝对路径读取到图片。

所以jsp这里src可以直接用/imgUrl

附件:<img src="/imgUrl/<%=att%>"/><br/>

然后切记:重启tomcat


step2:idea需要配置tomcat中的:勾选以下就行。
在这里插入图片描述


嗯。然后就可以显示图片了!!!哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈快乐!!!!!!!!!!!!!!!!!!!

嘿嘿 下一个想搞一下 上传文件 然后查看的时候可以下载下来的功能。本期就到这里!


参考文献:
ssm框架实现图片上传显示并保存地址到数据库

IDEA设置虚拟路径,解决前端展示本地磁盘图片问题!


http://chatgpt.dhexx.cn/article/V0bVFytS.shtml

相关文章

SQL Server数据库基础知识——数据库存储过程怎么写

SQL Server数据库基础知识 存储过程概述 什么是存储过程&#xff1f; 存储过程的种类 如何创建、修改、删除、调用存储过程&#xff1f; 存储过程的优缺点 存储过程和触发器的区别? 存储过程和函数的区别? 存储过程的使用 1. 什么是存储过程&#xff1f; 存储过程是…

GaussDB数据库存储过程介绍

文章目录 一、前言二、GaussDB中的定义三、存储过程的使用场景四、存储过程的使用优缺点五、存储过程的示例及示例解析1、GaussDB存储过程语法格式2、GaussDB存储过程语法示例3、存储过程的调用方法 七、总结 一、前言 华为云数据库GaussDB是一款高性能、高安全性的云原生数据…

查看当前数据库存储引擎

一&#xff1a;查看当前数据库支持的存储引擎 show ENGINES; 二:查看指定数据库所有表使用的存储引擎 使用 show table status from dbname;命令&#xff0c;可以查看指定数据库所有表使用的存储引擎&#xff0c;其中“dbname”为数据库名。 show table status from 库名; 三…

数据库储存Excel表信息

目录 目标 实验背景 原理 具体实现 目标 以Java程序为中介&#xff0c;将Excel表中的信息储存到Mysql数据库中 实验背景 先需要将一张包含学生和老师信息的Excel表中的数据存储到Mysql数据库中 原理 先通过相关jar包的类从Excel表中读取到信息&#xff0c;接着对这些信息…

数据库之存储

无论是什么数据库&#xff0c;其本质还是以数据的形式存储在计算机的物理介质上的&#xff0c;所以&#xff0c;我们先来看看什么是物理存储介质。 物理存储介质:高速缓冲存储器->主存储器->快闪存储器->磁盘->光盘->磁带,从左到右性能由高到低&#xff0c;价格…

数据库存储介绍

数据存储在存储设备中&#xff0c;在实际应用中&#xff0c;有多种存储设备&#xff0c;下面我们一一介绍。同时在保存数据时&#xff0c;有特定的组织方式&#xff0c;在下面我也做简单介绍。 一 存储设备介绍 1.1 高速缓存 Cache&#xff0c;计算机拥有1M或跟多的高速…

Excel|给某一列添加同一个字

如图所示给新型冠状病毒肺炎数据中“武汉”这一列都加上“市”字&#xff1a; 先在D列打两行&#xff1a;“武汉市”、“孝感市” 然后在D3按CtrlE&#xff0c;即可全部填充 ps:如果删除某列同一个字的话用替换即可

鼠标单击就选中一个字的解决办法

有时候我们想在两个字中间插入一个字&#xff0c;点击鼠标时却总是选中一个字。 解决办法&#xff1a; 按一下键盘的Insert键就好了。 造成这种情况的原因&#xff1a;极大可能是因为我们删除文字时不小心碰到了Insert键。 看完如果对你有帮助&#xff0c;感谢点赞支持&…

什么是字节

** 什么是字节 ** 位&#xff08;bit&#xff09;:是计算机 内部数据 存储的最小单位 11001100是一个八位数的二进制数。 字节&#xff08;byte &#xff09;&#xff1a;是计算机中 数据处理的基本单位&#xff0c;习惯上用大写B来表示&#xff1b; 1B&#xff08;byte,字节…

关于“一个字等于多少字节?“的问题解答

网上有人说这个问法不严谨&#xff0c;我觉得严格说确实是这样&#xff0c;但是我个人觉得不能这样说&#xff01; 举个例子&#xff0c;这个问题就好比你上初中的时候那些证明题很多其实是很不严谨的&#xff0c;但是限于知识体系&#xff0c;到高中你会发现好像不是那么一回…

键盘打字时,打一个字后面少一个字如何解决

键盘敲字时&#xff0c;如果光标在中间&#xff0c;输入一个字后面就少一个字 文字输入的例子 只需要按INS键就可以恢复正常了 注&#xff1a;如果是手提笔记本电脑&#xff0c;一个键盘有两下两行&#xff0c;先按一下FN按键&#xff0c;再按INS即可切换为正常状态了

“一个字等于多少个字节?”是一个不严谨的问法

“一个字等于多少个字节&#xff1f;”是一个不严谨的问法 直接回答一个字等于多少个字节&#xff0c;也是不严谨的答法。 相关概念: 1、位&#xff08;bit&#xff09; 来自英文bit&#xff0c;音译为“比特”&#xff0c;表示二进制位。位是计算机内部数据储存的最小单位。…

parted分区命令行形式

一、pared分区实例 1、第一个主分区3G parted -s /dev/sdc mklabel gpt (标签为gpt&#xff0c;小于2t用msdos) parted -s /dev/sdc mkpart primary 0 3G 2、剩余空间给扩展分区 parted -s /dev/sdc mkpart entended 3 100% &#xff08;从3G开始后面都做扩展分区&#xff09;…

centos通过parted对2T以上硬盘分区并对根目录进行扩容

GPT的分区表很好了解决了传统MBR无法逾越2TB的限制。但是在Linux系统中&#xff0c;传统的fdisk命令无法支持gpt分区方式&#xff0c;这时候我们就要用到parted命令 需求&#xff1a; 将一个4t的硬盘&#xff08;sdb)分为3个区&#xff0c;并将sdb1挂载在根目录下进行扩容 1…

Linux Command parted 创建分区

Linux Command parted 创建分区 tags: lvm 文章目录 Linux Command parted 创建分区1. 简介2. 交互模式2.1 常见命令2.2 查看分区表2.3 修改成 GPT 分区表2.4 建立分区2.5 建立文件系统2.6 调整分区大小2.7 删除分区 3. 命令行模式 1. 简介 虽然我们可以使用 fdisk命令对硬…

parted分区详解

---------- Linux中有两种常用的分区表MBR分区表(主引导记录分区表)和GPT分区表(GUID分区表)&#xff0c;其中&#xff1a; MBR分区表&#xff1a;支持的最大分区时2TB&#xff0c;最多支持4个主分区&#xff0c;或3个主分区和1个拓展分区。 GPT分区表&#xff1a;支持最大18…

parted磁盘分区 教程

Linux parted磁盘分区实现步骤解析 相对于fdisk&#xff0c;parted用的比较少&#xff0c;主要用于大于2T的分区。 1.开始分区 help是查看帮助信息。 2.查看磁盘信息 可以看到当前磁盘没有分区&#xff0c;需要将分区表&#xff08;Partition Table&#xff09;类型更改为g…

【Windows环境下使用fvm管理多版本Flutter(flutter版本升级回退)】

Windows环境下使用fvm管理多版本Flutter&#xff08;flutter版本升级回退&#xff09; 安装FVM升级版本升级后&#xff0c;使用方法二再次安装fvm 安装FVM 方式一&#xff1a; 使用choco安装fvm&#xff08;当时环境中Flutter版本是1.22.4&#xff0c;Dart是2.10.4&#xff0…

一个很好用的Flutter SDK版本管理神器fvm

前言 目前Flutter SDK正式版本已经更新到2.2.了&#xff0c;当升级了最新版运行之前的项目&#xff0c;其中最大的变化应该是要适配空安全了&#xff0c;这时如果项目又比较紧急暂不做适配&#xff0c;又只能降级Flutter版本了&#xff0c;然后新项目又要在最新Flutter版本去开…

在MacOS上不用FVM的Flutter多版本管理

网上看到都是用fvm进行多版本管理。 我用的方式没那么复杂&#xff0c;非常简单。 从下面url下载各版本的Flutter: https://flutter.dev/docs/development/tools/sdk/releases?tabmacos 按常规方式配置Flutter的环境。 将下载的Flutter包解压成文件夹后&#xff0c;都放到…