欢迎大家来到别爱的CSDN
前言一、代码实现
1.服务端读取图片2.服务端写入图片3.数据库读取图片4.数据库写入图片5.全部代码(以及部分注释) 总结参考资料
前言
生活中大多数的场景都不单单只是数据,还有其它许多信息,今天就给大家介绍一种比较常见的数据:图片。如何实现图片的插入数据库,以及数据库图片的读取
提示:以下是本篇文章正文内容,下面案例可供参考
一、代码实现 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, ¶m); 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#include #include /// 把一些常量定义在这,使代码变得可读性更高 #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, ¶m); 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高级开发课程
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)