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

article/2025/6/19 4:50:35

目录

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

 


http://www.hkcw.cn/article/RwYoUhjvcn.shtml

相关文章

乌方披露对俄特种作战行动细节 41架俄军战机被击中

当地时间6月2日,乌克兰国家安全局局长瓦西里马柳克宣布,乌克兰国家安全局在代号为“蛛网”的特别行动中袭击了俄罗斯后方部署战机的四个军用机场。此次行动导致41架俄军战机被击中,其中包括A-50、图-95、图-22M3和图-160战机。他表示,这次行动摧毁了俄罗斯34%的战略巡航导弹…

日本人在华被杀害 日本政府发声 商业纠纷引发

6月3日,大连公安发布公告称,5月23日在辽宁大连发生一起因商业纠纷引发的命案,两名日本籍男子被一名中国籍男子杀害。日本政府相关人士表示,此案属于个案,不存在“反日”等背景因素。大连警方在警情通报中提到,5月23日接到报警,在普兰店区大刘家街道辖内发生一起致两人死…

免签名单不断变长彰显中国对外开放决心 持续优化入境政策

6月3日,外交部发言人林剑主持例行记者会。有记者提问关于中方近期推出的签证便利政策,包括面向东南亚国家的东盟签证便利政策以及从6月1日起对巴西、阿根廷、秘鲁、乌拉圭等五个拉美国家持普通护照人员试行免签政策。此外,中国还宣布实现对海合会国家免签全覆盖,这一系列措…

全国多地上调最低工资标准 覆盖数千万劳动者

2025年上半年,全国多地密集上调最低工资标准,成为民生领域的一大亮点。截至5月29日,已有重庆、四川、山西、广东等8个省份正式实施新标准,覆盖数千万劳动者。最低工资标准通常分为月最低工资标准和小时最低工资标准两种形式,前者适用于全日制就业劳动者,后者适用于非全日…

日本政府回应2名日本人被杀害 排除反日背景

大连公安于6月3日发布公告称,5月23日,因商业纠纷引发矛盾,两名日本籍男子在辽宁大连被一名中国籍男子杀害。日本政府相关人士表示,该案属于个案,不存在“反日”等背景因素。大连警方通报显示,5月23日,在普兰店区大刘家街道辖内发生一起致2人死亡的刑事案件。次日,犯罪嫌…

胡歌新身份正式官宣 担任上海市禁毒宣传大使

胡歌宣布了新身份。他不仅是镜头前演绎百态人生的演员,也是镜头后用清醒守护生命本色的禁毒宣传大使。在禁毒宣传公益片《面对毒品,请坚决说不!》中,中共上海市委政法委常务副书记、市禁毒委副主任张磊为胡歌颁发了上海市禁毒宣传大使聘书。毒品是人生剧本中最危险的“NG镜…

深度探索AI | 智算云平台与DeepSeek 的多元联动应用与模型微调全解析

文章目录 前言一、DeepSeek满血版使用2.1 关于蓝耘2.2 注册与登录2.3 使用DeepSeek 二、DeepSeek 基础概念回顾2.1 DeepSeek 模型架构概述2.2 DeepSeek 的预训练优势 三、DeepSeek 在自然语言处理领域的联动应用3.1 智能客服系统集成3.1.1 应用场景与优势3.1.2 实现流程与代码示…

本地部署vanna ai+通过http请求调用vanna

本地部署vanna ai ① 准备python环境&#xff0c;推荐最新的python12、13版本 ② 安装vanna库 我这里安装的python环境是python312 进入目录python312/Scripts&#xff0c;在该目录下的命令行窗口中输入以下命令&#xff1a;pip jinstall vanna pip install vanna③ 配置向…

和 AI 玩海龟汤差点崩溃:它永远比我多知道 100 个隐藏真相

关于海龟汤 第一次接触海龟汤时&#xff0c;我还以为这是某种美食烹饪挑战&#xff0c;直到朋友抛出第一个谜题 ——“一个人走进酒吧&#xff0c;要了一杯水&#xff0c;酒保却掏出一把枪对准他&#xff0c;可这个人不仅没害怕&#xff0c;反而说了声谢谢离开了”&#xff0c…

个人健康中枢的多元化AI软件革新与精准健康路径探析

引言 人工智能技术的迅猛发展正在重塑医疗健康领域的服务模式和用户体验。随着多模态大模型、MCP协议、A2A协议和思考链算法等创新技术的出现,个人健康中枢正在经历一场深刻的软件革新。这些技术不仅打破了传统健康管理系统的信息孤岛,还通过多维度数据整合和深度推理能力,…

探索高性能AI识别和边缘计算 | NVIDIA Jetson Orin Nano 8GB 开发套件的全面测评

随着边缘计算和人工智能技术的迅速发展&#xff0c;性能强大的嵌入式AI开发板成为开发者和企业关注的焦点。NVIDIA近期推出的Jetson Orin Nano 8GB开发套件&#xff0c;凭借其40 TOPS算力、高效的Ampere架构GPU以及出色的边缘AI能力&#xff0c;引起了广泛关注。本文将从配置性…

利用本地DeepSeek R1和n8n框架,创建AI智能体

如今&#xff0c;AI 越来越智能。在本地部署个人 AI 智能体&#xff0c;是一件意义重大的事&#xff1a;无需云服务和 API&#xff0c;就能完全自主掌控私人 AI&#xff0c;保障数据安全和隐私&#xff0c;还能个性化定制。 借助n8n、Ollama和DeepSeek-R1这三款超实用工具&…

【AI打标签】基于DeepSeek Janus为图片批量打标签

DeepSeek Janus的能力&#xff0c;相信不需要我多说了&#xff0c;看下面三张图片&#xff0c;自然就知道了。 但是&#xff0c;如何通过DeepSeek Janus提高我们的工作生产力&#xff0c;在这里&#xff0c;我给大家说道说道。 ★★★★★ 建议一定看到最后&#xff0c;至于为…

SpringAI+MCP协议 实战

文章目录 前言Spring AIMcp&#xff08;Model Context Protocol&#xff09; 快速实战Spring AISpring AI 集成 MCP 协议Spring Mcp Client 示例Spring Mcp Server 示例 前言 大模型发展可能到了接近成熟的程度了&#xff0c;但是业界的重点肯定不会仅仅就放在大模型上的&…

AI+游戏开发:如何用 DeepSeek 打造高性能贪吃蛇游戏

文章目录 一、技术选型与准备1.1 传统开发 vs AI生成1.2 环境搭建与工具选择1.3 DeepSeek API 初步体验 二、贪吃蛇游戏基础实现2.1 游戏结构设计2.2 初始化游戏2.3 DeepSeek 生成核心逻辑 三、游戏功能扩展3.1 多人联机模式3.2 游戏难度动态调整3.3 游戏本地保存与回放3.4 跨平…

AI智能体|扣子(Coze)全网最详细讲解(保姆级)

没有任何编程基础&#xff1f;没关系&#xff01; 这篇保姆级教程将手把手教你用Coze平台打造能搜索新闻、分析数据、创作内容的AI智能体&#xff0c;让你的工作效率提升300%。从此告别加班&#xff0c;让AI成为你最强力的工作伙伴&#xff01; 什么是AI智能体&#xff1f;一个…

国足备战世预赛生死战 力争两连胜

中国男足国家队于6月2日晚抵达印度尼西亚首都雅加达,准备参加5日举行的2026美加墨世界杯亚洲区预选赛18强赛第9轮对阵印尼队的比赛。当地时间晚上10时30分,中国队在主教练伊万科维奇的带领下走出雅加达苏加诺-哈达国际机场,随后登上大巴前往酒店。伊万科维奇表示,中国队在…

滕州走失男孩遗体被发现 溺水身亡排除刑案

6月2日晚,山东省滕州市公安局发布警情通报。5月31日22时35分许,滕州市公安局接到孔某某报警,称其10岁的外孙赵某某于当日17时许离家后失联。接警后,公安机关迅速行动,调阅监控、走访群众,并联合当地政府和社会救援力量,使用搜救警犬和无人机等手段持续搜寻。6月2日15时许…

官方通报幼童掉入高铁股道 儿童已安全交还家长

6月2日下午,上铁淮南西站发布了一则情况说明。5月31日16时09分左右,铁路工作人员在淮南南站3号站台边缘下方发现了一名儿童,并迅速将其拉上站台。经了解,这名儿童当天随家长乘坐G7446次列车,在列车停靠淮南南站3号站台期间,不慎从列车和站台之间的间隙掉入股道。经过初步…

ubuntu安装devkitPro

建议开个魔法 wget https://apt.devkitpro.org/install-devkitpro-pacman chmod x ./install-devkitpro-pacman sudo ./install-devkitpro-pacman&#xff08;下面这句如果报错也没事&#xff09; sudo ln -s /proc/self/mounts /etc/mtab往~.bashrc添加 export DEVKITPRO/o…