mysql图片存取初探

  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%',
}}
/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ljl2107

感谢我能帮助到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值