欢迎大家来到别爱的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 failed\n");
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: %d\n",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 failed\n");
return -2;
}
int size = fwrite(buffer, 1, length, fp);
if (size != length) {
printf("fwrite failed: %d\n", 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 :%s\n", 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: %s\n", mysql_error(handle));
return -3;
}
ret = mysql_stmt_execute(stmt);
if (ret) {
printf("mysql_stmt_execute :%s\n", mysql_error(handle));
return -4;
}
ret = mysql_stmt_store_result(stmt);
if (ret) {
printf("mysql_stmt_store_result: %s\n", 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: %s\n", 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 :%s\n", mysql_error(handle));
return -3;
}
ret = mysql_stmt_send_long_data(stmt, 0, buffer, length);
if (ret) {
printf("mysql_stmt_send_long_data :%s\n", mysql_error(handle));
return -4;
}
ret = mysql_stmt_execute(stmt);
if (ret) {
printf("mysql_stmt_execute: %s\n", mysql_error(handle));
return -5;
}
ret = mysql_stmt_close(stmt);
if (ret) {
printf("mysql_stmt_close :%s\n", 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 failed\n");
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: %d\n",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 failed\n");
return -2;
}
int size = fwrite(buffer, 1, length, fp);
if (size != length) {
printf("fwrite failed: %d\n", 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: %s\n", 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 :%s\n", mysql_error(handle));
return -3;
}
ret = mysql_stmt_send_long_data(stmt, 0, buffer, length);
if (ret) {
printf("mysql_stmt_send_long_data :%s\n", mysql_error(handle));
return -4;
}
ret = mysql_stmt_execute(stmt);
if (ret) {
printf("mysql_stmt_execute: %s\n", mysql_error(handle));
return -5;
}
ret = mysql_stmt_close(stmt);
if (ret) {
printf("mysql_stmt_close :%s\n", 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 :%s\n", 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: %s\n", mysql_error(handle));
return -3;
}
ret = mysql_stmt_execute(stmt);
if (ret) {
printf("mysql_stmt_execute :%s\n", mysql_error(handle));
return -4;
}
ret = mysql_stmt_store_result(stmt);
if (ret) {
printf("mysql_stmt_store_result: %s\n", 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 :%s\n", 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 :%s\n", mysql_error(&mysql));
return -2;
}
printf("case: mysql --> read image and write mysql\n");
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("\n\n");
printf("case: mysql --> read mysql and write image\n");
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数据库的图片插入,以及图片的读取,上述遇到不清楚的函数,下篇博客我会统一介绍。