远程从数据库提取图片

本文介绍如何利用mysql-connector-c++从数据库中提取以二进制存储的图片,并将其保存到本地文件系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文使用的是mysql的 mysql-connector-c++ 

图片是以二进制形式保存在数据库中,将图片从数据库中提取出来保存到本地。

代码如下:

#include <iostream>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <mysql.h>
using namespace std;


string path = "D:\\data\\test\\";


int main()
{
	const char username[] = "root";
	const char password[] = "***";
	const char host[] = "192.168.1.1";
	const char dbname[] = "test";
	unsigned int port = 3306;


	MYSQL conn;
	if (NULL == mysql_init(&conn))
	{
		cout << "init conn fail." << endl;
		exit(-1);
	}


	if (!(mysql_real_connect(&conn, host, username, password, dbname, 0, NULL, 0)))
	{
		cerr << "connect to database error" << endl;
		exit(-1);
	}


	char sql[] = "select octet_length(pic), pic from face_check_history";
	if (0 != mysql_real_query(&conn, sql, strlen(sql)))
	{
		cerr << "query error." << endl;
		exit(-1);
	}


	MYSQL_RES * result = NULL;
	result = mysql_store_result(&conn);
	if (!result)
	{
		cerr << "store result error." << endl;
		exit(-1);
	}


	if (0 >= mysql_affected_rows(&conn))
	{
		cout << "no data be found." << endl;
		exit(-1);
	}


	MYSQL_ROW row_record;
	int count = 0;
	while (row_record = mysql_fetch_row(result))
	{
		unsigned int size = 0;
		char * temp_buff = NULL;


		sscanf(row_record[0], "%d", &size);
		temp_buff = (char *)malloc(size * sizeof(char)+1);
		if (temp_buff == NULL)
		{
			printf("malloc error!\n");
			exit(1);
		}


		if ((0 == size) || (NULL == row_record[1]))
		{
			cerr << "invalid record!" << endl;
			continue;
		}
		memset(temp_buff, 0, size * sizeof(char)+1);


		memcpy(temp_buff, row_record[1], size * sizeof(char));
		stringstream pic_name;
		pic_name << count << ".jpg";
		ofstream outfile(path + pic_name.str(), ios::binary);
		outfile.write(temp_buff, size);


		count++;
		free(temp_buff);
	}
	mysql_close(&conn);
}

vb提取查看thumbs.db文件中的图像内容,VB6.0编写开发的Windows XP缩略图缓存文件查看提取工具,把有图片的文件夹中的Thumbs.db拖到下面的列表框中(在资源管理器的文件夹选项设置中要取消“隐藏受保护的系统文件(推荐)”,才可以看到XP的缓存缩略图文件Thumbs.db)。   实现原理部分需要说明的是:PSC原作者使用String类型来读取,这可能是英文操作系统上可以运行,但是在中文操作系统是错误的,在用 Preserve 关键字时,只能改变多维数组中最后一维的上界;所以,第1维存放数据,范围就是0(缩略图Jpg大小最大不会超过5KB),第2维根据项目的个数来表示的编号但是不能直接使用数组的形式来返回,必须用传址的方式返回   还有一种方法,是记录每个图片文件项目的差异的偏移,及插入的非jpg数据块的大校   因为没有Thumbs.db的详细文件格式资料,无法获取文件的个数现在这个版本有一个问题,会有些文件看不到,因为查看文件内容发现,中间有些Jpg文件很短,只有几百字节,与文件数据前的文件大小不符合,这样就会跳过一个文件,导致漏掉文件。   增加一个判断,每找到一个标志,跳过文件长度时,先判断该长度的文件尾是不是Jpg的文件尾标志,如果不是则从之前的位置继续搜索。一种情况:就是4位字节文件大小的值,小于实际的文件大小值,这就需要搜索修正在Thumbs.db文件里找到了全部对应文件的文件名,是用Unicode字符存储在里面的,有的是单独的一个,有的是几个连续一起。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值