c mysql如何获取照片_MYSQL数据库存取图片等文件(C语言)
直接把文件放入数据库中比较适合小文件,方便管理,比如头像图片和声音,如果是较大型的文件建议不要直接存进数据库,而是放在服务器,把文件索引放在数据库。
MYSQL 中有个数据对象是 BLOB,即 Binary Large Object,顾名思义也就是二进制大型数据对象,用来记录二进制的数据,它有 4 种类型,分别是:tinyblob(255B)、blob(65KB)、mediumblob(16MB)、longblob(4GB)。
我在数据库中创建了一张 images 表,如下图:
先把用到的头文件和预处理写一下:
#include
#include
#include
#include
#include
#pragma comment(lib, "libmysql.lib")
#define BYTE unsigned char
#define FILE_MAX_SIZE (65 * 1024) /*文件最大65KB*/
接下来的任务就是怎么把数据记录到 img 字段,我用C语言写了个函数,函数接受文件路径:
void insert(char *path)
{
FILE *fp;
BYTE *img, data;
long cnt = 0;
MYSQL mysql;
char *sql;
/*读取文件*/
fp = fopen(path, "rb");
if (!fp)
{
printf("读取文件失败\n");
return;
}
img = malloc(FILE_MAX_SIZE); //分配65KB的内存
memset(img, FILE_MAX_SIZE, 0);
while (!feof(fp))
{
fread(&data, 1, 1, fp);
if (data == '\0') //将结束字符转义
{
img[cnt++] = '\\';
img[cnt++] = '0';
continue;
}
if (data == '\'' || data == '\\' /*|| data == '\"'*/) //这些字符也要转义
{
img[cnt++] = '\\';
}
img[cnt++] = data;
if (cnt == FILE_MAX_SIZE)
{
printf("文件超过65KB\n");
free(img);
fclose(fp);
return;
}
}
img[cnt] = '\0';
fclose(fp);
/*操作数据库*/
if (NULL == mysql_init(&mysql))
{
printf("初始化数据库失败\n");
return;
}
if (NULL == mysql_real_connect(&mysql, "localhost", "root", "password", "test", 0, NULL, 0))
{
printf("连接数据库失败\n");
return;
}
sql = malloc(126 + FILE_MAX_SIZE);
memset(sql, 126 + FILE_MAX_SIZE, 0);
sprintf(sql, "INSERT INTO images (img) VALUES ('%s')", img);
if (0 != mysql_real_query(&mysql, sql, strlen(sql)))
{
printf("执行SQL语句出错\n");
mysql_close(&mysql);
free(sql);
free(img);
return;
}
mysql_close(&mysql);
free(sql);
free(img);
printf("插入成功\n");
}
从以上代码可以看出整个过程是将文件以二进制形式读出,然后再执行 SQL 语句。
下面我要将文件从数据库中读取出来,存放本地,该函数结束文件路径和在数据库中的 id 字段:
void peek(char *filename, int id)
{
MYSQL mysql;
FILE *fp;
char sql[126];
MYSQL_RES *res;
MYSQL_ROW row;
long *length;
/*操作数据库*/
if (NULL == mysql_init(&mysql))
{
printf("初始化数据库失败\n");
return;
}
if (NULL == mysql_real_connect(&mysql, "localhost", "root", "password", "test", 0, NULL, 0))
{
printf("连接数据库失败\n");
return;
}
sprintf(sql, "SELECT img FROM images WHERE id=%d", id);
if (0 != mysql_real_query(&mysql, sql, strlen(sql)))
{
printf("执行SQL语句出错\n");
}
res = mysql_store_result(&mysql);
if (NULL == res)
{
printf("数据库中无结果\n");
mysql_close(&mysql);
}
row = mysql_fetch_row(res);
length = mysql_fetch_lengths(res); //得到img字段数据的长度
mysql_close(&mysql);
/*写入文件*/
fp = fopen(filename, "wb");
if (!fp)
{
mysql_free_result(res);
mysql_close(&mysql);
printf("创建文件失败\n");
return;
}
fwrite(row[0], 1, length[0], fp); //这里千万不能用strlen计算长度,因为文件中可能有很多结束标志字符'\0'
fclose(fp);
mysql_free_result(res);
mysql_close(&mysql);
printf("读取成功\n");
} 我开始被 strlen 的问题搞得晕头转向,心想不用 strlen 那我再用什么得到长度呢,还好后来找到了 mysql_fetch_lengths 这个函数。
c mysql如何获取照片_MYSQL数据库存取图片等文件(C语言)相关推荐
- 安卓 mysql读取图片路径_android开发之数据库存取图片
Android数据库中存取图片通常使用两种方式,一种是保存图片所在路径,二是将图片以二进制的形式存储(sqlite3支持BLOB数据类型).对于两种方法的使用,好像第二种方法不如第一种方法更受程序员欢 ...
- delphi使用ADO在sql数据库存取图片的方法
delphi使用ADO在sql数据库存取图片的方法 新手参考,老鸟绕行 我一直不认为能把代码写的和天书一样的程序员是好的程序员,那不过是因为我真的对delphi也就是略懂皮毛,太深了看不懂. 网上查询 ...
- mysql fetchall获取不到数据_解决pymysql cursor.fetchall() 获取不到数据的问题
1.之前的写法(不报错): data = cursor.fetchall() data_name = data[0]['task_type'] 2.简洁的写法(报错): data = cursor.f ...
- python读取nc文件并转换成csv_使用Python截取nc文件数据保存到CSV文件-Go语言中文社区...
问题要求: 编写一个函数完成以下任务:截取经度在23°N-40°N,纬度在118°E-131°E范围内各属性不同深度的数据,使用Python中合适的数据结构将截取的数据保存到同名CSV文件中.(nc文 ...
- mysql数据库存表情报错_mysql数据库存表情报错
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- mysql双向同步读写_mysql数据双向同步
即读写操作在两台服务器上进行,每台服务器即主也是从.当其中的任何一台服务器收到操作请求时,其进行相应的数据变化,并把变化的数据复制到另一台服务器中. 4 数据同步实现 4.1mysql数据双向同步 4 ...
- mysql状态监听_Mysql数据状态监听探讨(攒人品)_MySQL
bitsCN.com 年会前攒人品,你懂得! 应用场景: 长时间运行程序,需要几乎整表查询Mysql,还得在可容忍范围内响应数据变化. 方案一:通过Mysql自带的表更新时间 查询方案:SELECT ...
- mysql 用户表结构设计_MySQL数据表结构设计
1表结构 每个表的内容: image image image image image image image image 2表关系 天蓝色代表表中有唯一索引. image 3数据表索引与时间戳 ima ...
- php mysql只获取一条数据_php mysql 查询只返回第一条数据
php mysql 查询只返回第一条数据 $search = mysql_query("select * from `info`"); $search = mysql_fetch_ ...
最新文章
- Android 多线程-----AsyncTask详解
- 通过日期获取一周的那一天
- Socket简介及客户端服务器连接实例
- 【推荐】会开发和懂开发的区别
- CSS3的calc()使用
- NorFlash与NandFlash
- ip变换器苹果系统_加密锁能为高铁做什么?铁路电力变换器系统告诉您
- 破51项国际榜单纪录!解读华为云擎天架构调度求解引擎
- matlab freqs函数用法,Matlab freqs 函数
- 游戏找不到DirectX的解决方法
- 关于计算机病毒的试题,计算机病毒测试题.doc
- 惯量比多少合适_惯量比折算问题
- BASH脚本基础:使用md5sum命令生成消息摘要指纹与验证
- Html提交表单的制作
- Python3 多种方式爬取最新30期双色球历史数据存入csv
- 部署Unbound实现DNS服务
- 计算机上没有端口DOT4,dot4_001端口
- 形容词,名词记忆(四):al后缀常用词
- 解决TypeError: Converting circular structure to JSON
- 职业生涯自我规划五步
热门文章
- php与nginx链接,Nginx与PHP的交互
- 【NIO】IO多路复用
- oracle log block size,案例:Oracle无法启动报错ORA-00218: block size 0 重建控制文件
- channelinboundhandler中都包含了哪一类的方法_数据仓库、数据集市、数据湖、数据中台到底有什么区别?都得做吗?...
- linux挂载硬盘_一篇文章带你了解 linux 如何进行挂载
- 浅谈Python flask框架浅析
- excel2007无法加载mysql_Excel2007中进行无法安装加载项的解决方法
- Git的工作区与暂存区
- Java单元测试的意义_单元测试重要意义及方法介绍
- android md日期选择器,移动端日期选择