MySQL数据库中存储图片和读取图片的操作

文章目录

      • 方法一:将图片以 BLOB 类型存储在数据库中
        • MySQL 语句实现
        • Python 实现
      • 方法二:将图片存储在文件系统中,并在数据库中存储路径
        • MySQL 语句实现
        • Python 实现
      • 总结

在MySQL数据库中存储图片通常有两种主要方式:将图片以二进制数据(BLOB 类型)直接存储在数据库中,或者将图片文件存储在服务器文件系统上,而在数据库中存储图片的路径或URL。以下是这两种方法的详细解释,包括存储和读取操作。

方法一:将图片以 BLOB 类型存储在数据库中

MySQL 语句实现
  1. 创建表
    首先,你需要在 MySQL 中创建一个包含 BLOB 字段的表来存储图片。

    CREATE TABLE images (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,image LONGBLOB NOT NULL
    );
    
  2. 插入图片
    假设你已经有了图片数据(可能是从文件读取的二进制数据),你可以使用 INSERT INTO ... VALUES 语句来插入图片。

    INSERT INTO images (name, image) VALUES ('example.jpg', LOAD_FILE('/path/to/example.jpg'));
    

    注意LOAD_FILE() 函数要求 MySQL 服务器对指定路径有读取权限,且该路径必须在 MySQL 服务器的 secure_file_priv 变量指定的目录中(如果启用了该变量)。

  3. 读取图片
    要从数据库中读取图片,你可以使用 SELECT 语句,并在应用程序中处理返回的二进制数据。

    SELECT image FROM images WHERE id = 1;
    

    要检索图片数据并将其保存为文件,你可以使用SELECT语句和INTO OUTFILE:

    SELECT image FROM images WHERE id = 1 INTO OUTFILE '/path/to/your/output.jpg';
    

    注意:使用LOAD_FILE()和INTO OUTFILE需要相应的文件系统权限。此外,对于大型二进制数据,请考虑性能影响,因为BLOB数据类型可能会影响数据库性能。

Python 实现
  1. 插入图片

    import mysql.connector# 连接到数据库
    conn = mysql.connector.connect(host='localhost',user='your_username',password='your_password',database='your_database'
    )
    cursor = conn.cursor()# 读取图片文件
    with open('/path/to/example.jpg', 'rb') as file:binary_data = file.read()# 插入图片到数据库
    sql = "INSERT INTO images (name, image) VALUES (%s, %s)"
    val = ('example.jpg', binary_data)
    cursor.execute(sql, val)
    conn.commit()# 关闭连接
    cursor.close()
    conn.close()
    
  2. 读取图片

    import mysql.connector
    from io import BytesIO
    from PIL import Image# 连接到数据库
    conn = mysql.connector.connect(host='localhost',user='your_username',password='your_password',database='your_database'
    )
    cursor = conn.cursor()# 从数据库中读取图片
    sql = "SELECT image FROM images WHERE id = 1"
    cursor.execute(sql)
    result = cursor.fetchone()
    image_data = result[0]# 使用 PIL 库显示图片
    image = Image.open(BytesIO(image_data))
    image.show()# 关闭连接
    cursor.close()
    conn.close()
    

方法二:将图片存储在文件系统中,并在数据库中存储路径

MySQL 语句实现
  1. 创建表
    创建一个只包含图片路径或 URL 的表。

    CREATE TABLE images (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,path VARCHAR(255) NOT NULL
    );
    
  2. 插入图片路径
    当图片文件被保存到文件系统后,将其路径插入到数据库中。

    INSERT INTO images (name, path) VALUES ('example.jpg', '/path/to/example.jpg');
    
  3. 读取图片路径
    从数据库中读取图片路径,并使用该路径在文件系统中访问图片。

    SELECT path FROM images WHERE id = 1;
    

    要检索图片数据并将其保存为文件,你可以使用SELECT语句和INTO OUTFILE:

    SELECT image FROM images WHERE id = 1 INTO OUTFILE '/path/to/your/output.jpg';
    

    注意:使用LOAD_FILE()和INTO OUTFILE需要相应的文件系统权限。此外,对于大型二进制数据,请考虑性能影响,因为BLOB数据类型可能会影响数据库性能。

Python 实现
  1. 保存图片到文件系统并插入路径

    import os
    import mysql.connector# 连接到数据库
    conn = mysql.connector.connect(host='localhost',user='your_username',password='your_password',database='your_database'
    )
    cursor = conn.cursor()# 保存图片到文件系统
    file_path = '/path/to/save/example.jpg'
    with open('/path/to/example.jpg', 'rb') as source_file:with open(file_path, 'wb') as dest_file:dest_file.write(source_file.read())# 插入图片路径到数据库
    sql = "INSERT INTO images (name, path) VALUES (%s, %s)"
    val = ('example.jpg', file_path)
    cursor.execute(sql, val)
    conn.commit()# 关闭连接
    cursor.close()
    conn.close()
    
  2. 读取图片路径并显示图片

    import mysql.connector
    from PIL import Image# 连接到数据库
    conn = mysql.connector.connect(host='localhost',user='your_username',password='your_password',database='your_database'
    )
    cursor = conn.cursor()# 从数据库中读取图片路径
    sql = "SELECT path FROM images WHERE id = 1"
    cursor.execute(sql)
    result = cursor.fetchone()
    image_path = result[0]# 使用 PIL 库显示图片
    image = Image.open(image_path)
    image.show()# 关闭连接
    cursor.close()
    conn.close()
    

总结

  • BLOB 存储:适合存储小图片或需要保持数据完整性的场景,但可能会增加数据库的大小和备份复杂性。
  • 文件系统存储:适合存储大图片或需要频繁访问的场景,可以减少数据库负载,但需要确保文件系统的可用性和安全性。

选择哪种方法取决于具体的应用场景和需求。

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

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

相关文章

AWD入门

一、简介 AWD(Attack With Defense,攻防兼备)模式。你需要在一场比赛里要扮演攻击方和防守方,攻者得分,失守者会被扣分。也就是说攻击别人的靶机可以获取 Flag 分数时,别人会被扣分,同时你也要保护自己的主机不被别人…

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断

强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断 目录 强心剂!EEMD-MPE-KPCA-LSTM、EEMD-MPE-LSTM、EEMD-PE-LSTM故障识别、诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 EEMD-MPE-KPCA-LSTM(集合经验模态分解-多尺…

【JAVA】第三张_Eclipse下载、安装、汉化

简介 Eclipse是一种流行的集成开发环境(IDE),可用于开发各种编程语言,包括Java、C、Python等。它最初由IBM公司开发,后来被Eclipse Foundation接手并成为一个开源项目。 Eclipse提供了一个功能强大的开发平台&#x…

IDEA如何给debug断点加上筛选条件判断

前言 我们在使用IDEA开发Java应用时,经常是需要进行代码调试的,这就需要打断点进行操作。但有些时候,我们只希望在符合某种条件的情况下,才去到这个断点,不符合的情况下,直接跳过断点,这其实也…

【linux】线程 (三)

13. 常见锁概念 (一)了解死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程占有的,且不释放的资源,而处于的一种永久等待状态 (二)死锁四个必要条件 互斥条件…

RK3568平台开发系列讲解(调试篇)debugfs 文件系统

🚀返回专栏总目录 文章目录 一、debugfs使用案例二、enable debugfs三、debugfs API3.1、创建目录3.2、创建文件3.3、帮助函数四、使用示例📢Linux 上有一些典型的问题分析手段,从这些基本的分析方法入手,你可以一步步判断出问题根因。这些分析手段,可以简单地归纳为下图…

Linux·文件与IO

1. 回忆文件操作相关知识 我们首先回忆一下关于文件的一些知识。 如果一个文件没有内容,那它到底有没有再磁盘中存在?答案是存在,因为 文件 内容 属性,即使文件内容为空,但属性信息也是要记录的。就像进程的…

基于STM32的Android控制智能家政机器人

基于STM32的Android控制智能家政机器人 基于STM32的Android控制智能家政机器人一、项目背景与意义二、系统设计方案三、硬件电路设计四、软件设计与实现4.1 Android端软件设计4.2 机器人端软件设计 五、系统调试与测试六、结论与展望七、附录 基于STM32的Android控制智能家政机…

从外行人的角度解释1Bit的模型,是怎样改变世界的

一个框架,和一篇论文,改变了模型训练的规则 框架是BitNET 论文https://arxiv.org/abs/2410.16144 有人问我什么是1.58Bit 是这样的。 fp16是一般情况下模型训练后产物的精度。 比如qwen2 8B fp16,文件大小15GB 如果量化成Q_4O&#xff…

24下河南秋季教资认定保姆级教程

教师资格认定前需要做的准备材料 准备身份证户口本 居住证 学生证 教师考试合格证明 普通话证书 学历证书 体检合格证书 近期一寸白底证件照 网上报名 河南24下教资认定 网上报名时间:10月21日-11月1日 现场确认 网上审核未通过的宝子,需要…

html+css+js实现Notification 通知

实现效果&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Notif…

k8s use-context是什么

kubectl 的 use-context 命令用于在 Kubernetes 集群中切换上下文&#xff08;context&#xff09;&#xff0c;从而方便地在多个集群或命名空间之间进行操作。一个上下文定义了 kubectl 使用的 集群、用户 和 命名空间 的组合。 use-context 的作用&#xff1a; 每个上下文&…

AOP学习

corol调用serverce不在是直接调用的是调用底层代理对象&#xff0c;由代理对象统一帮我们处理 AOP常见概念 通知类型 切面顺序

【C++】— 一篇文章让你认识STL

文章目录 &#x1f335;1.什么是STL&#xff1f;&#x1f335;2.STL的版本&#x1f335;3.STL的六大组件&#x1f335;4.STL的重要性&#x1f335;5. 如何学习STL&#x1f335;6. 学习STL的三种境界 &#x1f335;1.什么是STL&#xff1f; STL是Standard Template Library的简称…

Matlab软件进行金融时间序列数据的描述性统计代码

1、数据S&P500的收盘价格&#xff0c;return100*log(pt/pt-1) 方法1&#xff1a;用python代码 import numpy as np import pandas as pddef calculate_log_returns(prices):"""计算价格序列的对数收益率。参数:prices (numpy.array): 价格序列。返回:log_…

【实战指南】Vue.js 介绍组件数据绑定路由构建高效前端应用

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

ChatGPT 现已登陆 Windows 平台

今天&#xff0c;OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示&#xff0c;该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户&#xff0c;是一个早期版本&#xff0c;将在今年晚些时候推出"完整体验"。…

LeetCode 热题100之哈希

1.两数之和 思路分析1&#xff08;暴力法&#xff09; 双重循环枚举满足num[i] nums[j] target的索引&#xff0c;刚开始不知道如何返回一对索引。后来知道可以直接通过return {i,j}返回索引&#xff1b;注意&#xff1a;j应该从i1处开始&#xff0c;避免使用两次相同的元素…

liunx线程

线程的概念 程序中的一个执行路线就是线程&#xff0c;线程就是一个进程内部的控制序列一个进程至少都有一个执行线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行liunx系统下&#xff0c;cpu眼里的PCB比传统进程更加轻量化透过虚拟地址空间&#xff0c;把进程的…

展会亮点回顾|HMS汽车工业通信解决方案

2024 汽车测试及质量监控博览会&#xff08;中国&#xff09;&#xff08;Testing Expo China – Automotive&#xff09;于 8 月 28 日至 30 日在上海世博展览馆顺利举行。作为汽车测试技术领域的顶级盛会&#xff0c;来自全球的行业领袖和技术专家齐聚一堂&#xff0c;共同探…