当前位置:   article > 正文

Java实现数据库图片上传(包含从数据库拿图片传递前端渲染)-图文详解_java从数据库中取出图片转成buffer 数据传给前端

java从数据库中取出图片转成buffer 数据传给前端

目录

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博客上有,各位可以去看看。

建表语句:

  1. create table test2(
  2. id int auto_increment primary key ,
  3. name varchar(100) comment '名称',
  4. photo blob comment '照片'
  5. )

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

思想:

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

1、找到图片位置

2、图片转为Fileinputstream流

3、存储数据库

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

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

  1. package com.example.jishedemo2.img;
  2. import java.io.*;
  3. public class imgeuntil {
  4. /**
  5. * @author Administrator
  6. *
  7. */
  8. // 读取本地图片获取输入流
  9. public static FileInputStream readImage(String path) throws IOException {
  10. return new FileInputStream(new File(path));
  11. }
  12. // 读取表中图片获取输出流
  13. public static void readBin2Image(InputStream in, String targetPath) {
  14. File file = new File(targetPath);
  15. String path = targetPath.substring(0, targetPath.lastIndexOf("/"));
  16. if (!file.exists()) {
  17. new File(path).mkdir();
  18. }
  19. FileOutputStream fos = null;
  20. try {
  21. fos = new FileOutputStream(file);
  22. int len = 0;
  23. byte[] buf = new byte[1024];
  24. while ((len = in.read(buf)) != -1) {
  25. fos.write(buf, 0, len);
  26. }
  27. fos.flush();
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. } finally {
  31. if (null != fos) {
  32. try {
  33. fos.close();
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }
  39. }
  40. }

存储数据库 

 mapper层:

  1. package com.example.jishedemo2.img;
  2. import org.apache.ibatis.annotations.Insert;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import org.apache.ibatis.annotations.Select;
  5. import java.io.FileInputStream;
  6. import java.io.InputStream;
  7. import java.util.List;
  8. @Mapper
  9. public interface imagemapper {
  10. @Insert("insert into test2 values(null,#{name},#{photo})")
  11. void inser(String name, FileInputStream photo);
  12. }

 service层:

  1. package com.example.jishedemo2.img;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Service;
  4. import java.io.FileInputStream;
  5. import java.util.List;
  6. @Service
  7. public class imageservice implements imge{
  8. @Autowired
  9. private imagemapper imagemapper;
  10. @Override
  11. public void inser(String name, FileInputStream file) {
  12. imagemapper.inser(name,file);
  13. }
  14. }

 control层:

  1. package com.example.jishedemo2.img;
  2. import com.example.jishedemo2.dao.Result;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.PostMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. import java.sql.PreparedStatement;
  9. import java.util.List;
  10. @RestController
  11. public class imgedemo {
  12. @Autowired
  13. private imageservice imageservice;
  14. // 将图片插入数据库
  15. @PostMapping("test3")
  16. public void readImage2DB() throws IOException {
  17. String path = "D:\\wsstext.png";
  18. try {
  19. FileInputStream in = null;
  20. in = imgeuntil.readImage(path);
  21. imageservice.inser("测试",in);
  22. in.close();
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }

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

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

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

dao层:

  1. package com.example.jishedemo2.img;
  2. import java.io.FileInputStream;
  3. import java.io.InputStream;
  4. public class photo {
  5. int id;
  6. String name;
  7. byte[] photo;
  8. public photo() {
  9. }
  10. public photo(int id, String name, byte[] photo) {
  11. this.id = id;
  12. this.name = name;
  13. this.photo = photo;
  14. }
  15. /**
  16. * 获取
  17. * @return id
  18. */
  19. public int getId() {
  20. return id;
  21. }
  22. /**
  23. * 设置
  24. * @param id
  25. */
  26. public void setId(int id) {
  27. this.id = id;
  28. }
  29. /**
  30. * 获取
  31. * @return name
  32. */
  33. public String getName() {
  34. return name;
  35. }
  36. /**
  37. * 设置
  38. * @param name
  39. */
  40. public void setName(String name) {
  41. this.name = name;
  42. }
  43. /**
  44. * 获取
  45. * @return photo
  46. */
  47. public byte[] getPhoto() {
  48. return photo;
  49. }
  50. /**
  51. * 设置
  52. * @param photo
  53. */
  54. public void setPhoto(byte[] photo) {
  55. this.photo = photo;
  56. }
  57. public String toString() {
  58. return "photo{id = " + id + ", name = " + name + ", photo = " + photo + "}";
  59. }
  60. }

mapper层:

  1. package com.example.jishedemo2.img;
  2. import org.apache.ibatis.annotations.Insert;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import org.apache.ibatis.annotations.Select;
  5. import java.io.FileInputStream;
  6. import java.io.InputStream;
  7. import java.util.List;
  8. @Mapper
  9. public interface imagemapper {
  10. @Insert("insert into test2 values(null,#{name},#{photo})")
  11. void inser(String name, FileInputStream photo);
  12. @Select("select * from test2")
  13. List<photo> select();
  14. }

service层:

  1. package com.example.jishedemo2.img;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Service;
  4. import java.io.FileInputStream;
  5. import java.util.List;
  6. @Service
  7. public class imageservice implements imge{
  8. @Autowired
  9. private imagemapper imagemapper;
  10. @Override
  11. public void inser(String name, FileInputStream file) {
  12. imagemapper.inser(name,file);
  13. }
  14. @Override
  15. public List<photo> select() {
  16. return imagemapper.select();
  17. }
  18. }

control层:

  1. package com.example.jishedemo2.img;
  2. import com.example.jishedemo2.dao.Result;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.PostMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. import java.sql.PreparedStatement;
  9. import java.util.List;
  10. @RestController
  11. public class imgedemo {
  12. @Autowired
  13. private imageservice imageservice;
  14. // 将图片插入数据库
  15. @PostMapping("test3")
  16. public void readImage2DB() throws IOException {
  17. String path = "D:\\wsstext.png";
  18. PreparedStatement ps = null;
  19. try {
  20. FileInputStream in = null;
  21. in = imgeuntil.readImage(path);
  22. imageservice.inser("测试",in);
  23. in.close();
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. //传数据
  29. @PostMapping("test4")
  30. public Result select(){
  31. List<photo> photos = imageservice.select();
  32. return Result.success(photos);
  33. }
  34. }

前端拿到效果: 

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并将其作为图像内容显示在页面上,而无需从外部服务器加载图像。

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

  1. <template>
  2. <div>
  3. <img v-if="imageUrl" :src="imageUrl" alt="Image from backend" />
  4. </div>
  5. </template>
  6. <script>
  7. import axios from 'axios'
  8. export default {
  9. data() {
  10. return {
  11. imageUrl: null
  12. }
  13. },
  14. mounted(){
  15. axios.post("http://localhost:8080/test4").then((e) => {
  16. this.imageUrl= "data:image/png;base64," + e.data.data[0].photo;
  17. })
  18. }

尾言 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/996371
推荐阅读
相关标签