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函数里的文件名及其后缀。
代码中支持的文件大小最大为1M,需要更大的只需修改data和chunk数组大小,修改fread函数中数据块的个数。
Linux下编译的时候需要加上mysql.h的路径。

gcc -I/usr/include/mysql main.c -L/usr/lib/mysql -lmysqlclient -o main
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Frodo__Baggins

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值