问题描述
最近需要实现Linux下socket文件传输接收并存储到MySQL数据库,用到了MySQL中的图片存取操作。
MySQL知识
MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它可以容纳不同大小的数据。
MySQL的四种BLOB类型:
类型 | 大小 |
---|---|
TINYBLOB | 最大255B |
BLOB | 最大65KB |
MEDIUMBLOB | 最大16MB |
LONGBLOB | 最大4GB |
建表
create table Images(ID int primary key,Data mediumblob);
图片存储
找一张图片,和代码放在同一文件夹下。
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
int main(int argc, char **argv)
{
MYSQL *conn;//一个数据库链接指针
int len, size;
char data[1000*1024];
char chunk[2*1000*1024+1];
char query[1024*5000];
FILE *fp;
conn = mysql_init(NULL);//初始化连接句柄
if(conn == NULL) { //如果返回NULL说明初始化失败
printf("mysql_init failed!\n");
return EXIT_FAILURE;
}
//进行实际连接
//参数 conn连接句柄,host mysql所在的主机或地址,user用户名,passwd密码,database_name数据库名,后面的都是默认
mysql_real_connect(conn, "localhost", "root", "123456", "test", 0, NULL, 0);
if (conn) {
printf("Connection success!\n");
} else {
printf("Connection failed!\n");
}
fp = fopen("test.jpg", "rb");
size = fread(data, 1, 1024*1000, fp);
mysql_real_escape_string(conn, chunk, data, size);
char *stat = "INSERT INTO Images(id, data) VALUES('2', '%s')";
len = snprintf(query, sizeof(stat)+sizeof(chunk) , stat, chunk);
mysql_real_query(conn, query, len);
fclose(fp);
mysql_close(conn);
}
图片获取
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
int main(int argc, char **argv)
{
MYSQL *conn;//一个数据库链接指针
MYSQL_RES *result;
MYSQL_ROW row;
unsigned long *lengths;
FILE *fp;
conn = mysql_init(NULL); //初始化连接句柄
if(conn == NULL) { //如果返回NULL说明初始化失败
printf("mysql_init failed!\n");
return EXIT_FAILURE;
}
//进行实际连接
//参数 conn连接句柄,localhost所在的主机或地址,user用户名,passwd密码,database_name数据库名,后面的都是默认
mysql_real_connect(conn, "localhost", "user", "passwd", "database_name", 0, NULL, 0);
if (conn) {
printf("Connection success!\n");
} else {
printf("Connection failed!\n");
}
fp = fopen("igetyou.jpg", "wb");
mysql_query(conn, "SELECT data FROM Images WHERE id=2");
result = mysql_store_result(conn);
row = mysql_fetch_row(result);
lengths = mysql_fetch_lengths(result);
fwrite(row[0], lengths[0], 1, fp);
mysql_free_result(result);
fclose(fp);
mysql_close(conn);
}
最后
代码实现了最基本的图片存储与获取,其他需要的功能可以自己加。
这里的文件存取并不仅限于图片,可以改成其他文件格式,可改成音频,视频,经测试都可存取成功。有需要的可以自己改一改,只需要修改fopen函数里的文件名及其后缀。
Linux下编译的时候需要加上mysql.h的路径。
gcc -I/usr/include/mysql main.c -L/usr/lib/mysql -lmysqlclient -o main