mysql图片存取初探

news2024/11/13 9:26:27
  1. mysql数据库中使用blob存储
  2. 使用base64加密图片数据

前言

这个方法并不好,因为传输的数据量还是蛮大的,可以存一些诸如头像的小图片,但是如果要存较大的图片会很慢。
不过只是课程作业中简单的功能,这样子简单又快捷,无所谓啦。

详情

数据库

首先设计数据库表,这里使用longblob
在这里插入图片描述

A BLOB is a binary large object that can hold a variable amount of data.
The four BLOB types are TINYBLOB, BLOB, MEDIUMBLOB, and LONGBLOB.
These differ only in the maximum length of the values they can hold.
BLOB是存储二进制大对象的。可以用来存储图片、视频、音频等数据。
根据可以存储文件大小的不同,分为TINYBLOB,BLOB,MEDIUMBLOB,LONGBLOB。

类型可存储大小
TINYBLOB0-255Byte
BLOB0-65KB
MEDIUMBLOB0-16MB
LONGBLOB0-4GB
网络上流传甚广的是上面的表,但是和下面官方文档里有些出入,不过问题不大.大体意思是相似的.
mysql不同数据类型的存储空间需求

程序

存入数据库

本地图片测试

使用本地图片做测试,确保没有问题。

  @Test
    void upload() {
                /*
        加载驱动
         */
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取连接
            String url = "jdbc:mysql://localhost:3306/findperson?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC";
            String user = "root";
            String password = "pwd";
            try {
                Connection connection = DriverManager.getConnection(url, user, password);
                /*
                插入图片
                 */
                byte[] arr = getImgStr("D:\\Code\\Resource\\img\\comment-avatar\\2.jpg");
                Blob blob = connection.createBlob();
                blob.setBytes(1, arr);
                String sql = "insert into pictures (sid,pic) values(1,?)";

                PreparedStatement ps = connection.prepareStatement(sql);
                ps.setBlob(1, blob);
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        }
    }

前后端数据交流

upload-cn#components-upload-demo-avatar
使用antd上传组件,相关代码这里复制,这里就不凑字数了。
前端传来的数据是用MultipartFile接收的。

    public void uploadUserAvatar(Integer id,MultipartFile avatar) throws IOException, SQLException {
        byte[] bytes = avatar.getBytes();
        upload(id,bytes);//函数如下
    }
 void upload(Integer id, byte[] bytes) {
        try {
            Class.forName(driver);
            //获取连接
            String url = durl;
            String user = duser;
            String password = dpassword;
            try {
                Connection connection = DriverManager.getConnection(url, user, password);
                /*
                插入图片
                 */
                byte[] arr = bytes;
                Blob blob = connection.createBlob();
                blob.setBytes(1, arr);
                String sql = "insert into pictures (sid,pic) values(?,?)";

                PreparedStatement ps = connection.prepareStatement(sql);
                ps.setInt(1,id);
                ps.setBlob(2, blob);
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

从数据库中提出并展示

    @Override
    public MockMultipartFile getStudentAvatar(Integer sid) throws SQLException, ClassNotFoundException {
        byte[] bytes = read(sid);
        MockMultipartFile multipartFile = new MockMultipartFile("avatar.png",bytes);
        return multipartFile;
    }
    public static byte[] read(Integer sid) throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        //获取连接
        String url = durl;
        String user = duser;
        String password = dpassword;
        Connection connection = DriverManager.getConnection(url, user, password);
        String sql = ("select pic from pictures where sid = ?");//根据需求自己写
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        byte[] bytes = null;
        try {
            statement = connection.prepareStatement(sql);
            statement.setInt(1,sid);
            resultSet = statement.executeQuery();
            //创建blob接受resultset得到的blob数据
            while (resultSet.next()) {
                Blob blob = resultSet.getBlob("pic");
                bytes = blob.getBytes(1, (int) blob.length());
            }
        } catch(
                SQLException throwables) {
            throwables.printStackTrace();
        }
        return bytes;
    }

控制层

    @GetMapping(value = "/user-manage/avatar",produces = MediaType.IMAGE_PNG_VALUE)
    @ResponseBody
    String getStudentAvatar() throws SQLException, ClassNotFoundException, IOException {
        MockMultipartFile studentAvatar = userService.getStudentAvatar(currentUser.getId());
        byte[] bytes = studentAvatar.getBytes();//图片的字节数组
        BASE64Encoder encoder = new BASE64Encoder();
        String data = encoder.encode(bytes);
        return data;
    }

前端获取数据,注意拼接一下

axios.get("http://localhost:8080/user-manage/avatar")
        .then(res => {
            console.log("获取的头像数据",res)
            setImageUrl("data:image/jpeg;base64,"+res.data)
    })

直接就可以展示

<img
src={imageUrl}
alt="avatar"
style={{
    width: '100%',
}}
/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1123151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

各类深度学习框架详解+深度学习训练环境搭建-GPU版本

目录 前言 一、深度学习框架 TensorFlow PyTorch Keras Caffe PaddlePaddle 二、深度学习框架环境搭建 1.CUDA部署 CUDA特性 CUDA下载 2.cuDNN cuDNN 的主要特性 cuDNN 下载 3.安装TensorFlow框架 TensorFlow 2 旧版 TensorFlow 1 4.安装PyTorch框架 5.安装Ca…

MySQL字段加密方案 安当加密

要通过安当KSP密钥管理系统实现MySQL数据库字段的加密&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装和配置安当KSP密钥管理系统&#xff1a;首先&#xff0c;您需要安装安当KSP密钥管理系统&#xff0c;并按照说明进行配置。确保您已经正确地设置了密钥管理系统的用…

数据结构与算法之图: Leetcode 417. 太平洋大西洋水流问题 (Typescript版)

太平洋大西洋水流问题 https://leetcode.cn/problems/pacific-atlantic-water-flow/description/ 描述 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界和下边界。 这个岛被…

Elsevier上传LaTeX修改稿常见问题解决方法

在撰写科研论文时&#xff0c;一般会使用latex或者word两种工具。在论文的返修阶段&#xff0c;很多期刊要求我们上传可编辑格式的稿件。word在上传到爱思唯尔系统中时候很方便&#xff0c;但latex是较为麻烦的&#xff0c;下面和大家分享一下我在上传latex手稿时遇到的一些问题…

【人工智能】LLM 大型语言模型和 Transformer 架构简介

目录 大型语言模型 (LLM) 一、LLM的起源 二、LLM的发展阶段 三、LLM的应用领域

torch.nn.Parameter()

一文通俗理解torch.nn.Parameter() 一、起源 首先&#xff0c;我写这篇文章的起源是因为&#xff0c;我突然看到了一段有关torch.nn.Parameter()的代码。 因此就去了解了一下这个函数&#xff0c;把自己的一些理解记录下来&#xff0c;希望可以帮到你。 二、官方文档 网址如下…

单目3D目标检测[基于几何约束篇]

基于语义和几何约束的方法 1. Deep3DBox 3D Bounding Box Estimation Using Deep Learning and Geometry [CVPR2017]https://arxiv.org/pdf/1612.00496.pdfhttps://zhuanlan.zhihu.com/p/414275118 核心思想&#xff1a;通过利用2D bounding box与3D bounding box之间的几何约…

直播录屏没有声音?解决方案来了!

在进行游戏直播、教程制作或在线会议录制时&#xff0c;有声音的录屏是至关重要的。然而&#xff0c;有时用户可能会面临直播录屏没有声音的问题。在本文中&#xff0c;我们将介绍两种常用的方法来解决这个问题&#xff0c;通过遵循下面的步骤&#xff0c;您将能够轻松地添加声…

Osgb转3DTiles工具

三维倾斜摄影生产主要格式为Osgb&#xff0c;目前三维模型主要展示场景为web&#xff0c;大部分使用框架都是Cesium库&#xff0c;格式为 3DTiles&#xff0c;目前市面上osgb转3DTiles的软件已经有好几个&#xff0c;付费免费都有。 先说免费软件&#xff1a; 1、CesiumLab …

SaaS是云计算服务,不是互联网平台

习惯性的把SaaS云计算服务&#xff0c;理解成平台&#xff0c;是不对的&#xff01; SaaS本质就是云计算服务&#xff0c;企业在saas应用系统里操作业务&#xff0c;背后都是各种云计算操作。 但是&#xff0c;中国的互联网环境就都是巨头平台所主导&#xff0c;所以大家基本…

华为OD机试 - 寻找最大价值的矿堆 - 矩阵(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多…

工具让公众号推送变得轻而易举

公众号运营的关键在于定期向用户推送内容&#xff0c;但手动推送过程繁琐且浪费时间。现在&#xff0c;有了乔拓云公众号助手工具&#xff0c;你可以轻松实现公众号的自动推送功能。让我们一起来看看如何操作吧&#xff01; 首先&#xff0c;你需要注册一个乔拓云公众号助手工具…

阿里云新品云服务器实例,经济型e实例,价格便宜,性价比高

前不久&#xff0c;阿里云推出了一款全新云服务器实例&#xff0c;他是阿里云面向个人开发者、学生、小微企业&#xff0c;在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器&#xff0c;基于“飞天CIPU”黄金技术架构设计&#xff0c;可轻松满足网站建设…

C语言指针详解——必备7大知识点

Part1指针是什么? 1.1 浅谈指针 理解指针的 两个要点&#xff1a; 指针是内存中一个最小单元的编号&#xff0c;也就是地址&#xff1b; 平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量。 总结&#xff1a;指针就是地址&#xff…

UPS负载箱的工作原理是什么?

UPS负载箱&#xff08;Uninterruptible Power Supply Load Bank&#xff09;内部包含一组电阻器&#xff0c;通过调节电阻值来模拟不同负载条件。当UPS供电时&#xff0c;电阻器会吸收一定的电能&#xff0c;从而模拟实际负载对UPS的需求。UPS负载箱配备了控制系统&#xff0c;…

2023年京东双11京享红包领取入口介绍

2023年京东双11京享红包领取入口介绍 抢京东2023年双11超级红包共计4步骤即可。在今天京东公布了2023年双11红包密令&#xff0c;这是最新准确有效的哦!建议大家提前收藏密令&#xff0c;开始时间是10月23日生效。具体的2波时间见后&#xff0c;下面跟随小编一起来看看抢红包教…

DC电源模块的数字电源优势

BOSHIDA DC电源模块的数字电源优势 数字电源模块是指在电源的设计和控制上采用数字式方案&#xff0c;采用数字化技术&#xff0c;将传统的电源模块从模拟传统电源转变为数字电源变成的模块。 传统的电源模块使用模拟技术&#xff0c;其主要优势在于可控性高、稳定性好&#…

2-MySQL的基本操作记录

1 数据库相关 -- --------------------表相关的---------- -- 查看字符集 show variables like %character%;show databases;# 创建数据库 create database test2;# 删除数据库 drop database test2; show databases;#查看当前使用的数据库 select database(); 2 用户相关 -…

Spring Boot自动配置原理揭秘

自动配置原理 概述原理Spring Boot Starterspring.factories 文件ConditionalOnX 注解配置 Bean配置属性 源码剖析 主页传送门&#xff1a;&#x1f4c0; 传送 概述 Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程序的框架。它极大地简化了 Spring 应用程序的开…

潮玩产业迈向千亿级,泡泡玛特未来发展空间可观

作为融合了艺术与创意的新品类&#xff0c;潮玩成为当下一种火热的消费现象。目前&#xff0c;全球潮玩产业处于快速增长期。近期&#xff0c;新华网联合中国社会科学院财经战略研究院发布的《超越潮流&#xff1a;千亿级潮玩产业彰显人文经济价值——潮玩产业发展报告&#xf…