Linux C/C++ 实现MySQL的图片插入以及图片的读取


欢迎大家来到别爱的CSDN


前言

生活中大多数的场景都不单单只是数据,还有其它许多信息,今天就给大家介绍一种比较常见的数据:图片。如何实现图片的插入数据库,以及数据库图片的读取


提示:以下是本篇文章正文内容,下面案例可供参考

一、代码实现

1.服务端读取图片

代码如下(示例):

int read_image(char* filename,char* buffer) {

	if (filename == NULL || buffer == NULL)return -1;

	FILE* fp = fopen(filename, "rb");
	if (fp == NULL) {
		printf("fopen failedn");
		return -2;
	}

	//file size
	fseek(fp, 0, SEEK_END);
	int length = ftell(fp);
	fseek(fp, 0, SEEK_SET);

	int size = fread(buffer, 1, length, fp);
	if (size != length) {
		printf("fread failed: %dn",size);
		return size;
	}

	fclose(fp);

	return size;

}

2.服务端写入图片

代码如下(示例):

int write_image(char* filename, char* buffer, int length) {

	if (filename == NULL || buffer == NULL || length <= 0) return -1;

	FILE* fp = fopen(filename, "wb+");
	if (fp == NULL) {
		printf("fopen failedn");
		return -2;
	}
	
	int size = fwrite(buffer, 1, length, fp);
	if (size != length) {
		printf("fwrite failed: %dn", size);
		return -3;
	}

	fclose(fp);
	return size;
}

3.数据库读取图片

代码如下(示例):

int mysql_read(MYSQL* handle, char* buffer, int length) {

	if (handle == NULL || buffer == NULL || length <= 0)return -1;

	MYSQL_STMT* stmt = mysql_stmt_init(handle);
	int ret = mysql_stmt_prepare(stmt, SQL_SELECT_IMG_USER, strlen(SQL_SELECT_IMG_USER));
	if (ret) {
		printf("mysql_stmt_prepare :%sn", mysql_error(handle));
		return -2;
	}

	MYSQL_BIND result = { 0 };

	result.buffer_type = MYSQL_TYPE_LONG_BLOB;
	unsigned long total_length = 0;
	result.length = &total_length;

	ret = mysql_stmt_bind_result(stmt, &result);
	if (ret) {
		printf("mysql_stmt_bind_result: %sn", mysql_error(handle));
		return -3;
	}

	ret = mysql_stmt_execute(stmt);
	if (ret) {
		printf("mysql_stmt_execute :%sn", mysql_error(handle));
		return -4;
	}

	ret = mysql_stmt_store_result(stmt);
	if (ret) {
		printf("mysql_stmt_store_result: %sn", mysql_error(handle));
		return -5;
	}


	while (1) {

		ret = mysql_stmt_fetch(stmt);
		if (ret != 0 && ret != MYSQL_DATA_TRUNCATED) break;	

		int start = 0;
		while (start < (int)total_length) {
			result.buffer = buffer + start;
			result.buffer_length = 1;
			mysql_stmt_fetch_column(stmt, &result, 0, start);
			start += result.buffer_length;
		}

	}

	mysql_stmt_close(stmt);

	return total_length;

}

4.数据库写入图片

代码如下(示例):

int mysql_write(MYSQL* handle, char* buffer, int length) {

	if (handle == NULL || handle == NULL || length <= 0)return -1;

	MYSQL_STMT* stmt = mysql_stmt_init(handle);
	int ret = mysql_stmt_prepare(stmt, SQL_INSERT_IMG_USER, strlen(SQL_INSERT_IMG_USER));
	if (ret) {
		printf("mysql_stmt_prepare: %sn", mysql_error(handle));
		return -2;
	}

	MYSQL_BIND param = { 0 };
	param.buffer_type = MYSQL_TYPE_LONG_BLOB;
	param.buffer = NULL;
	param.is_null = 0;
	param.length = NULL;

	 ret = mysql_stmt_bind_param(stmt, &param);
	if (ret) {
		printf("mysql_stmt_bind_param :%sn", mysql_error(handle));
		return -3;
	}

	ret = mysql_stmt_send_long_data(stmt, 0, buffer, length);
	if (ret) {
		printf("mysql_stmt_send_long_data :%sn", mysql_error(handle));
		return -4;
	}

	ret = mysql_stmt_execute(stmt);
	if (ret) {
		printf("mysql_stmt_execute: %sn", mysql_error(handle));
		return -5;
	}

	ret = mysql_stmt_close(stmt);
	if (ret) {
		printf("mysql_stmt_close :%sn", mysql_error(handle));
		return -6;
	}

	return ret;
}

5.全部代码(以及部分注释)

代码如下(示例):

#include<stdio.h>
#include<string.h>
#include<mysql.h>

/// 把一些常量定义在这,使代码变得可读性更高
#define BIEAI_DB_SERVER_IP "192.168.230.128"	//ip地址
#define BIEAI_DB_SERVER_PORT 3306	//端口号
#define BIEAI_DB_USERNAME "admin"	//用户名
#define BIEAI_DB_PASSWORD "131420"	//密码
#define BIEAI_DB_DEFAULTDB "BIEAI_DB"	//数据库名
#define SQL_INSERT_IMG_USER "INSERT TBL_USER(U_NAME,U_GENGDER,U_IMG) VALUES('wangwu','boy',?);"//数据库插入语句
#define SQL_SELECT_IMG_USER "SELECT U_IMG FROM TBL_USER WHERE U_NAME='wangwu';"	//数据库查询语句
#define FILE_IMAGE_LENGTH	(64*1024)//64k大小



int read_image(char* filename,char* buffer) {

	if (filename == NULL || buffer == NULL)return -1;

	FILE* fp = fopen(filename, "rb");//读权限
	if (fp == NULL) {
		printf("fopen failedn");
		return -2;
	}

	//file size
	fseek(fp, 0, SEEK_END);
	int length = ftell(fp);
	fseek(fp, 0, SEEK_SET);

	int size = fread(buffer, 1, length, fp);
	if (size != length) {
		printf("fread failed: %dn",size);
		return size;
	}

	fclose(fp);

	return size;

}


int write_image(char* filename, char* buffer, int length) {

	if (filename == NULL || buffer == NULL || length <= 0) return -1;

	FILE* fp = fopen(filename, "wb+");//继续写
	if (fp == NULL) {
		printf("fopen failedn");
		return -2;
	}
	
	int size = fwrite(buffer, 1, length, fp);
	if (size != length) {
		printf("fwrite failed: %dn", size);
		return -3;
	}

	fclose(fp);
	return size;
}


int mysql_write(MYSQL* handle, char* buffer, int length) {

	if (handle == NULL || handle == NULL || length <= 0)return -1;

	MYSQL_STMT* stmt = mysql_stmt_init(handle);
	int ret = mysql_stmt_prepare(stmt, SQL_INSERT_IMG_USER, strlen(SQL_INSERT_IMG_USER));
	if (ret) {
		printf("mysql_stmt_prepare: %sn", mysql_error(handle));
		return -2;
	}

	MYSQL_BIND param = { 0 };
	param.buffer_type = MYSQL_TYPE_LONG_BLOB;
	param.buffer = NULL;
	param.is_null = 0;
	param.length = NULL;

	 ret = mysql_stmt_bind_param(stmt, &param);
	if (ret) {
		printf("mysql_stmt_bind_param :%sn", mysql_error(handle));
		return -3;
	}

	ret = mysql_stmt_send_long_data(stmt, 0, buffer, length);
	if (ret) {
		printf("mysql_stmt_send_long_data :%sn", mysql_error(handle));
		return -4;
	}

	ret = mysql_stmt_execute(stmt);
	if (ret) {
		printf("mysql_stmt_execute: %sn", mysql_error(handle));
		return -5;
	}

	ret = mysql_stmt_close(stmt);
	if (ret) {
		printf("mysql_stmt_close :%sn", mysql_error(handle));
		return -6;
	}

	return ret;
}


int mysql_read(MYSQL* handle, char* buffer, int length) {

	if (handle == NULL || buffer == NULL || length <= 0)return -1;

	MYSQL_STMT* stmt = mysql_stmt_init(handle);
	int ret = mysql_stmt_prepare(stmt, SQL_SELECT_IMG_USER, strlen(SQL_SELECT_IMG_USER));
	if (ret) {
		printf("mysql_stmt_prepare :%sn", mysql_error(handle));
		return -2;
	}

	MYSQL_BIND result = { 0 };

	result.buffer_type = MYSQL_TYPE_LONG_BLOB;
	unsigned long total_length = 0;
	result.length = &total_length;

	ret = mysql_stmt_bind_result(stmt, &result);
	if (ret) {
		printf("mysql_stmt_bind_result: %sn", mysql_error(handle));
		return -3;
	}

	ret = mysql_stmt_execute(stmt);
	if (ret) {
		printf("mysql_stmt_execute :%sn", mysql_error(handle));
		return -4;
	}

	ret = mysql_stmt_store_result(stmt);
	if (ret) {
		printf("mysql_stmt_store_result: %sn", mysql_error(handle));
		return -5;
	}


	while (1) {

		ret = mysql_stmt_fetch(stmt);
		if (ret != 0 && ret != MYSQL_DATA_TRUNCATED) break;	

		int start = 0;
		while (start < (int)total_length) {
			result.buffer = buffer + start;
			result.buffer_length = 1;
			mysql_stmt_fetch_column(stmt, &result, 0, start);
			start += result.buffer_length;
		}

	}

	mysql_stmt_close(stmt);

	return total_length;

}






int main() {

	MYSQL mysql;

	if (NULL == mysql_init(&mysql)) {

		printf("mysql_init :%sn", mysql_error(&mysql));
		return -1;
	}

	if (!mysql_real_connect(&mysql, BIEAI_DB_SERVER_IP, BIEAI_DB_USERNAME, BIEAI_DB_PASSWORD, BIEAI_DB_DEFAULTDB, BIEAI_DB_SERVER_PORT, NULL, 0)) {//返回0成功

		printf("mysql_real_connect :%sn", mysql_error(&mysql));
		return -2;
	}


	printf("case: mysql --> read image and write mysqln");

	char buffer[FILE_IMAGE_LENGTH] = { 0 };
	int length = read_image("/home/root01/linux/05MYSQL/Linux.JPG", buffer);
	if (length < 0) goto Exit;

	mysql_write(&mysql, buffer, length);		//插入数据库

	printf("nn");

	printf("case: mysql --> read mysql and write imagen");

	memset(buffer, 0, FILE_IMAGE_LENGTH);
	length = mysql_read(&mysql, buffer, FILE_IMAGE_LENGTH);

	write_image("a.jpg", buffer, length);		//写出数据库




Exit:
	mysql_close(&mysql);

	return 0;

}




总结

今天主要给大家带来了MySQL数据库的图片插入,以及图片的读取,上述遇到不清楚的函数,下篇博客我会统一介绍。

参考资料

C/C++ Linux高级开发课程

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>