保存图片到MySQL&从MySQL读取图片

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 保存图片到MySQL&从MySQL读取图片

🍉接上次 爬取坤坤表情包 ,这次我们直接将表情包存到MySQL数据库而不是本地。🍉

🥭1. 创建数据库

首先创建一个数据库,数据库名为ikun,表名为img,3个字段分别为id(图片id)、img(二进制码)、date(存储时间)

其中,二进制码的存储格式应该为 BLOB类型,下面为不同类型对应的最大存储空间

  1. TINYBLOB 255个字节
  2. BLOB 65535字节
  3. MEDIUMBLOB 16M
  4. LONGBLOB 4G
USE ikun; 
CREATE TABLE `img` (
  `id` int NOT NULL AUTO_INCREMENT,
  `img` mediumblob NOT NULL,
  `date` date NOT NULL,
  PRIMARY KEY (`id`)
) ;

🍈2. 保存图片到数据库

将图片转为二进制流

对于图片的输入和输出,我们更多使用BufferedInputStream或者BufferedOutPutStream

public static void saveInMySQL(String url) throws IOException {
        //获得连接对象
        Connection con = DBUtil.getConnection("root","******","ikun");
        PreparedStatement pre = null;
        //获取图片信息,做输出流
        InputStream in = getEntityByHttpGetMethod(url).getContent();
        BufferedInputStream inputStream = new BufferedInputStream(in);
        try {
            String sql = "insert into img (img,date) values (?,?)";
            pre = con.prepareStatement(sql);
            pre.setBinaryStream(1,inputStream,in.available());
            Date date = new Date(System.currentTimeMillis());
            pre.setDate(2,date);
            //获取返回结果
            int i = pre.executeUpdate();
            System.out.println(i);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

查看效果

🍅 3. 从数据库读取图片

将二进制流转为文件输出到本地查看

public static void readFromMysql(){
        //获得连接对象
        Connection con = DBUtil.getConnection("root","******.","ikun");
        PreparedStatement pre = null;
        ResultSet res = null;
        try {
            //这里读取一张
            String sql = "select * from img where id = 1";
            pre = con.prepareStatement(sql);
            res = pre.executeQuery(sql);
            while (res.next()){
                int id = res.getInt("id");
                InputStream stream = res.getBinaryStream("img");
                Date date = res.getDate("date");
                System.out.println("图片id为"+id+" 创建时间为"+date.toString());
                Files.copy(stream, Paths.get("D:\\ikun.jpg"));
            }
        } catch (SQLException | IOException e) {
            e.printStackTrace();
        }
        //断开连接
        DBUtil.close();
    }

写在最后

        我发现阅读量挺高的但是没人收藏,确实,一般人相信看完下面就果断划走了,但试错不易,能不能留个点赞再走呢,谢谢~

🍊通常我们建议不要直接将图片存到数据库中,而是放到本地磁盘目录下,我们通常将图片统一命名,通过其文件名或路径来访问数据库实现获取图片的目的。

🍅而不建议直接往数据库存放图片的原因如下:

  1. 数据库性能下降:存储大量数据将占用大量的磁盘空间和系统资源,特别影响数据库性能,尤其是多用户访问的情况
  2. 数据库的备份和维护变得困难,且可读性差
  3. 压力测试:多用户同时上传或下载图片时,将导致数据库服务器压力负载过大

4.图片质量下降:比如我们待会的运行结果其实是这样的,左边是我们下载到本地的图片,右边则是下载到数据库,再从数据库读取出来的效果。而且我将二进制数值类型设置为最大还是模糊。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
37
分享
相关文章
8、Linux C/C++ 实现MySQL的图片插入以及图片的读取
8、Linux C/C++ 实现MySQL的图片插入以及图片的读取
126 0
保存图片到MySQL&从MySQL读取图片
首先创建一个数据库,数据库名为ikun,表名为img,3个字段分别为id(图片id)、img(二进制码)、date(存储时间)
新年迈出Java后台服务器与数据库交互第一步&2022最新通用Java8&jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作
新年迈出Java后台服务器与数据库交互第一步&2022最新通用Java8&jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作
新年迈出Java后台服务器与数据库交互第一步&2022最新通用Java8&jdbc8连接mysql8数据库进行增删改查等基本操作详解(IDEA),jar包导入,图片等文件流,批量操作
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
134 82
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
218 42