Linux下C语言实现MySQL图片存取

Linux下C语言实现MySQL图片存取

问题描述

最近需要实现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
发布了1 篇原创文章 · 获赞 5 · 访问量 77

猜你喜欢

转载自blog.csdn.net/Frodo__Baggins/article/details/105687266