当前位置: 首页 > news >正文

Java实现数据库图片上传(包含从数据库拿图片传递前端渲染)-图文详解

目录

1、前言:

2、数据库搭建 :

建表语句:

 3、后端实现,将图片存储进数据库:

思想:

 找到图片位置(如下图操作)

 图片转为Fileinputstream流的工具类(可直接copy)

存储数据库 

 mapper层:

 service层:

 control层:

 4、后端实现,从数据库取出图片给前端(可直接看这个,这个给的是所有代码)

dao层:

mapper层:

service层:

control层:

前端拿到效果: 

5、前端拿到后端传递的json信息渲染到网页

解释 :

如何实现渲染在网页:

尾言 


1、前言:

     我们使用数据库经常传递字符串、数字,但是很少在数据库存储图片、Word文件,我也去csdn找了找其他人的文章,只能说这类型的少的可怜,不是收费,就是讲的乱七八糟。既然如此,那么我将为需要这方面知识点的朋友写下这篇文章。本篇文章我们从以下几个方面:

  • 1、数据库搭建
  • 2、后端实现,将图片存储进数据库
  • 3、后端实现,从数据库取出图片给前端
  • 4、前端拿到后端传递的json信息渲染到网页

废话不多说,直接开始!

2、数据库搭建 :

本次数据库我们选择比较经典的Mysql(只是因为我只会这个),mysql提供一个字段类型叫做

blob,对于这个字段类型,我就不过多详细叙述,csdn博客上有,各位可以去看看。

建表语句:

create table test2(id int auto_increment primary key ,name varchar(100) comment '名称',photo blob comment '照片'
)

 3、后端实现,将图片存储进数据库:

思想:

 思想:实际上我们可以通过字节流的形式,将图片转成二进制,然后将其保存在数据库里面。我们按照以下步骤:

1、找到图片位置

2、图片转为Fileinputstream流

3、存储数据库

 找到图片位置(如下图操作)

 图片转为Fileinputstream流的工具类(可直接copy)

package com.example.jishedemo2.img;import java.io.*;public class imgeuntil {/*** @author Administrator**/// 读取本地图片获取输入流public static FileInputStream readImage(String path) throws IOException {return new FileInputStream(new File(path));}// 读取表中图片获取输出流public static void readBin2Image(InputStream in, String targetPath) {File file = new File(targetPath);String path = targetPath.substring(0, targetPath.lastIndexOf("/"));if (!file.exists()) {new File(path).mkdir();}FileOutputStream fos = null;try {fos = new FileOutputStream(file);int len = 0;byte[] buf = new byte[1024];while ((len = in.read(buf)) != -1) {fos.write(buf, 0, len);}fos.flush();} catch (Exception e) {e.printStackTrace();} finally {if (null != fos) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}}

存储数据库 

 mapper层:

package com.example.jishedemo2.img;import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;@Mapper
public interface imagemapper {@Insert("insert into test2 values(null,#{name},#{photo})")void inser(String name,  FileInputStream photo);}

 service层:

package com.example.jishedemo2.img;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.FileInputStream;
import java.util.List;@Service
public class imageservice implements imge{@Autowiredprivate imagemapper imagemapper;@Overridepublic void inser(String name, FileInputStream file) {imagemapper.inser(name,file);}}

 control层:

package com.example.jishedemo2.img;import com.example.jishedemo2.dao.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.FileInputStream;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.util.List;@RestController
public class imgedemo {@Autowiredprivate imageservice imageservice;// 将图片插入数据库@PostMapping("test3")public  void readImage2DB() throws IOException {String path = "D:\\wsstext.png";try {FileInputStream in = null;in = imgeuntil.readImage(path);imageservice.inser("测试",in);in.close();} catch (IOException e) {e.printStackTrace();}}}

没什么好说的,如果你不会javaweb,这边建议先去把javaweb学了。

 4、后端实现,从数据库取出图片给前端(可直接看这个,这个给的是所有代码)

这一步,多了一点,我们需要写一个类与数据库的表字段统一(dao层)

dao层:

package com.example.jishedemo2.img;import java.io.FileInputStream;
import java.io.InputStream;public class photo {int id;String name;byte[] photo;public photo() {}public photo(int id, String name, byte[] photo) {this.id = id;this.name = name;this.photo = photo;}/*** 获取* @return id*/public int getId() {return id;}/*** 设置* @param id*/public void setId(int id) {this.id = id;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return photo*/public byte[] getPhoto() {return photo;}/*** 设置* @param photo*/public void setPhoto(byte[] photo) {this.photo = photo;}public String toString() {return "photo{id = " + id + ", name = " + name + ", photo = " + photo + "}";}
}

mapper层:

package com.example.jishedemo2.img;import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;@Mapper
public interface imagemapper {@Insert("insert into test2 values(null,#{name},#{photo})")void inser(String name,  FileInputStream photo);@Select("select * from test2")List<photo> select();}

service层:

package com.example.jishedemo2.img;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.FileInputStream;
import java.util.List;@Service
public class imageservice implements imge{@Autowiredprivate imagemapper imagemapper;@Overridepublic void inser(String name, FileInputStream file) {imagemapper.inser(name,file);}@Overridepublic List<photo> select() {return imagemapper.select();}
}

control层:

package com.example.jishedemo2.img;import com.example.jishedemo2.dao.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.FileInputStream;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.util.List;@RestController
public class imgedemo {@Autowiredprivate imageservice imageservice;// 将图片插入数据库@PostMapping("test3")public  void readImage2DB() throws IOException {String path = "D:\\wsstext.png";PreparedStatement ps = null;try {FileInputStream in = null;in = imgeuntil.readImage(path);imageservice.inser("测试",in);in.close();} catch (IOException e) {e.printStackTrace();}}//传数据@PostMapping("test4")public Result select(){List<photo> photos = imageservice.select();return Result.success(photos);}}

前端拿到效果: 

5、前端拿到后端传递的json信息渲染到网页

 对于新手前端拿到photo,可能会很蒙蔽不知道这个是什么,我这里简要说一下:

解释 :

这段文本是一个HTML (HyperText Markup Language) 编码的字符串,它嵌入了一个Base64编码的图像数据(以data:image/png;base64,开头的部分,但在这个示例中被截断了),并包含了一些CSS (Cascading Style Sheets) 样式和JavaScript(虽然直接看起来并不包含JavaScript代码,但可能是在某处被引用或嵌入的)。

具体来说,这个字符串包含以下几个部分:

  1. Base64编码的图像数据:这部分以data:image/png;base64,开头,后跟一长串字符,这些字符是图像的二进制数据经过Base64编码后的结果。

  2. CSS样式:字符串中包含了一些CSS样式,如i标签的样式定义(i { ... }),这些样式可能用于控制HTML文档中元素的显示方式。但在这个示例中,CSS样式是直接嵌入在HTML中的,并且由于格式和上下文的原因,可能不完整或难以直接应用。

  3. HTML结构:字符串中包含了HTML的基本结构,如<div><span>等标签,以及自定义的类或ID属性(如class="..."id="..."),这些用于在CSS中引用并应用样式。

  4. JavaScript的引用或嵌入:虽然直接在这个字符串中没有看到JavaScript代码,但通常HTML页面会包含JavaScript代码或引用外部JavaScript文件来控制页面的行为。这个字符串可能只是HTML页面的一部分,而JavaScript代码可能位于其他位置。

  5. 特殊字符和注释:字符串中还包含了一些特殊字符(如//开头的注释)和格式化字符(如换行符\n),这些在HTML和CSS中用于提高代码的可读性和可维护性。

综上所述,这段文本是一个HTML编码的字符串,它结合了Base64编码的图像数据、CSS样式和HTML结构,可能还隐式地引用了JavaScript代码。这种格式常用于在网页中嵌入图像、样式和脚本,以实现丰富的视觉效果和交互功能。

如何实现渲染在网页:

在前端网页中嵌入使用Base64编码的图像字符串,可以直接将这个字符串作为<img>标签的src属性的值。由于Base64编码的图像数据被封装在data: URL中,浏览器可以直接解析这个URL并将其作为图像内容显示在页面上,而无需从外部服务器加载图像。

以下是一个该字符串在前端网页中嵌入图像的示例:

<template><div>  <img v-if="imageUrl" :src="imageUrl" alt="Image from backend" />  </div>  
</template><script>
import axios from 'axios'
export default {data() {return {imageUrl: null}},mounted(){axios.post("http://localhost:8080/test4").then((e) => {this.imageUrl= "data:image/png;base64," + e.data.data[0].photo;})}

尾言 

 🏆🏆🏆在本文中,我们深入探讨了如何使用Java实现数据库中的图片上传功能,并详细展示了如何将存储于数据库中的图片数据有效地传递到前端进行渲染。通过整合Spring Boot框架的便利性与数据库管理系统的强大功能,我们构建了一个高效、安全的图片管理系统。不仅实现了图片的上传与存储,还通过接口设计,使得前端能够灵活请求并展示这些图片资源。希望本教程能够为您的项目开发提供有力的技术支持与灵感启发。随着技术的不断进步,未来我们还将继续探索更多关于图像处理与传输的优化方案,以满足日益增长的业务需求。感谢您的阅读,期待与您一同在技术的道路上不断前行!🏆🏆🏆

 

相关文章:

Java实现数据库图片上传(包含从数据库拿图片传递前端渲染)-图文详解

目录 1、前言&#xff1a; 2、数据库搭建 &#xff1a; 建表语句&#xff1a; 3、后端实现&#xff0c;将图片存储进数据库&#xff1a; 思想&#xff1a; 找到图片位置&#xff08;如下图操作&#xff09; 图片转为Fileinputstream流的工具类&#xff08;可直接copy&#…...

开放式耳机原理是什么?通过不入耳的方式,享受健康听音体验

在开放式耳机的领域又细分了骨传导和气传导两种类型的耳机&#xff0c; 气传导开放式耳机原理 气传导是传统的声音传递方式&#xff0c;它依赖于空气作为声音传播的介质。 声源输入&#xff1a;与普通开放式耳机相同&#xff0c;音频设备通过耳机线将电信号传递到耳机。 驱动…...

有趣的PHP小游戏——猜数字

猜数字 这个游戏会随机生成一个1到100之间的数字,然后你需要猜测这个数字是什么。每次你输入一个数字后,程序会告诉你这个数字是“高了”还是“低了”,直到你猜对为止! 使用指南: 代码如下,保存到一个php中:如 index.php。代码部署到PHP服务器,比如 phpstudy。运行网…...

logstash 全接触

简述什么是Logstash &#xff1f; Logstash是一个开源的集中式事件和日志管理器。它是 ELK&#xff08;ElasticSearch、Logstash、Kibana&#xff09;堆栈的一部分。在本教程中&#xff0c;我们将了解 Logstash 的基础知识、其功能以及它具有的各种组件。 Logstash 是一种基于…...

Windows本地构建镜像推送远程仓库

下载 Docker Desktop https://smartidedl.blob.core.chinacloudapi.cn/docker/20210926/Docker-win.exe 使用本地docker构建镜像和推送至远程仓库&#xff08;harbor&#xff09; 1、开启docker的2375端口 2、配置远程仓库push镜像可以通过http harbor.soujer.com:5000ps&am…...

计算机毕业设计LSTM+Tensorflow股票分析预测 基金分析预测 股票爬虫 大数据毕业设计 深度学习 机器学习 数据可视化 人工智能

|-- 项目 |-- db.sqlite3 数据库相关 重要 想看数据&#xff0c;可以用navicat打开 |-- requirements.txt 项目依赖库&#xff0c;可以理解为部分技术栈之类的 |-- data 原始数据文件 |-- data 每个股票的模型保存位置 |-- app 主要代码文件夹 | |-- mod…...

最新版上帝粒子The God Particle(winmac),Cradle Complete Bundle 2024绝对可用

一。Cradle插件套装Cradle Complete Bundle 2024 Cradle 是一家音乐技术公司&#xff0c;致力于为个人提供所需的工具&#xff0c;使他们成为最好的音乐人。自发布我们的第一款插件 The Prince 以来&#xff0c;我们一直致力于不懈地打造可靠、有益且易于使用的产品&#xff0c…...

数 据 库

数据库是什么&#xff1f; 如何按照和移植数据库&#xff1f; 如何在命令行使用SQL语句操作数据库&#xff1f; 如何在C / C程序中操作数据库&#xff1f; 1. 数据库是什么&#xff1f; 数据库...

智能城市管理系统设计思路详解:集成InfluxDB、Grafana和MQTTx协议(代码示例)

引言 随着城市化进程的加快&#xff0c;城市管理面临越来越多的挑战。智能城市管理系统的出现&#xff0c;为城市的基础设施管理、资源优化和数据分析提供了现代化的解决方案。本文将详细介绍一个基于开源技术的智能城市管理系统&#xff0c;涵盖系统功能、技术实现、环境搭建…...

CloseableHttpClient.close() 导致 Connection pool shut down 的问题

TL;DR; CloseableHttpClient.close() 方法默认行为是关闭 HttpClientConnectionManager如果多个 CloseableHttpClient 共用了同一个 HttpClientConnectionManager&#xff0c;则第一个请求执行完&#xff0c;其他请求就会爆 Connection pool shut down 异常备注&#xff1a;ht…...

centos7 docker空间不足

今天在使用docker安装镜像的时候&#xff0c;出现报错 查看原因&#xff0c;发现是分区空间不足导致的 所以考虑进行扩容 首先在vmware扩容并没有生效 因为只是扩展的虚拟空间&#xff0c;并不支持扩展分区大小&#xff0c;下面对分区进行扩容 参考&#xff1a; 分区扩容 主…...

C#基于SkiaSharp实现印章管理(5)

印章中最常见的特殊形状通常是五角星&#xff0c;空心、实心的都可能存在&#xff0c;本文学习并实现在印章内部绘制五角星形状。   百度五角星的绘制方法&#xff0c;主要分为三种&#xff1a;   1&#xff09;五角星各点坐标固定&#xff0c;直接调用编程语言的绘制线条或…...

【C#】ThreadPool的使用

1.Thread的使用 Thread的使用参考&#xff1a;【C#】Thread的使用 2.ThreadPool的使用 .NET Framework 和 .NET Core 提供了 System.Threading.ThreadPool 类来帮助开发者以一种高效的方式管理线程。ThreadPool 是一个线程池&#xff0c;它能够根据需要动态地分配和回收线程…...

【Python系列】Python 中`eval()`函数的正确使用及其风险分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

使用Spring Boot开发应用:基于请求参数MD5的缓存键及其他缓存方式

本文将介绍如何在Spring Boot应用中实现基于请求参数MD5的缓存键&#xff0c;以及其他常见的缓存方式。通过实际代码示例&#xff0c;展示如何应用这些技术优化系统性能。 1. 引入必要的依赖 首先&#xff0c;在Spring Boot项目中引入缓存相关的依赖。修改pom.xml文件&#x…...

typescript中interface常见3种用法

文章目录 函数类型对象类型【自命名】&#xff1a; (函数)对象类型 函数类型 作用&#xff1a;声明一个函数接口&#xff1a;可用于类型声明 | 不可implements 对象类型 作用&#xff1a;声明对象具备哪些实例接口&#xff1a;可用于类型 | 可implements 【自命名】&…...

windows10 安装CUDA教程

如何在windows10系统上安装CUDA? 1、查看电脑的NVIDIA版本 nvidia-smi 2、官网下载所需CUDA版本 官网地址:https://developer.nvidia.com/cuda-toolkit-archive 我们所安装的CUDA版本需要小于等于本机电脑的NVIDIA版本。推荐使用迅雷下载,速度会更快哦。 3、安装步骤...

计算机毕业设计选题推荐-某炼油厂盲板管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

PSO求解函数最小值的MATLAB例程|MATLAB源代码

本篇文章适合PSO入门&#xff0c;进阶的可能会觉得太简单的。 目录 PSO例程作用运行结果代码函数解释 例程修改tips PSO Particle Swarm Optimization&#xff0c;粒子群优化算法&#xff0c;通过模拟鸟群或鱼群的行为来寻找最优解。在计算时通过对一群粒子的位置和速度进行迭…...

scrapy 爬取旅游景点相关数据(一)

配套视频可以前往B站&#xff1a;麦麦大数据 项目目标: 爬取的是穷游旅游景点列表 、评论数据 &#x1f4ca; 章节&#xff1a; &#x1f606; Scrapy 爬取旅游景点相关数据&#xff08;一&#xff09; &#x1f606; Scrapy 爬取旅游景点相关数据&#xff08;二&#xff09; &…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...