广

MYSQL

  • MYSQL
  • MSSQL
  • Redis
  • MongoDB
  • oracle数据库
  • 数据管理

    Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)

    2018-05-08 11:29:15 次阅读 稿源:互联网
    零七网广告
    全网推广平台,软文发布
    #include "stdafx.h"
    //是前一篇的姊妹篇
    //代码来自网络,我学习整理了一下,测试通过,下面的参数
    //需要设置为你自己的
    //在DBMS中线要创建数据库www,table www,file字段数据类型用LONGTEXT即可测试
    //测试文件c://test.iso,你可以找任何一个文件修改为即可,我找的是一个exe程序,修改为test.iso而已
    //最大测试过加入文件大小为650M(一个正真的iso文件)
    //注意:还要修改my.ini文件中的max_allowed_packet字段,我设置的是
    代码如下:

    //max_allowed_packet = 1024M
    //#define host "localhost" //mysql server
    //#define username "root"
    //#define password "674800"
    //#define database "test"
    //int port = 3306;
    #include <Winsock2.h>
    #include <stdio.h>
    #include <mysql.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #define host "localhost" //mysql server
    #define username "root"
    #define password "674800"
    #define database "www"
    int port = 3306;
    #pragma comment(lib,"libmysql.lib")
    //得到文件的大小(字节数)
    int get_file_size(char *path, off_t *size)
    {
    struct stat file_stats;
    if(stat(path, &file_stats))
    return -1;
    *size = file_stats.st_size;
    return 0;
    }
    int main(int argc, char *argv[])
    {
    char *filename=NULL;
    off_t size;
    MYSQL *conn=NULL;
    MYSQL_RES *res_set=NULL;
    MYSQL_ROW row;
    MYSQL_FIELD *field=NULL;
    int i, flag;
    char *sql; //sql语句
    FILE *fp;
    char *buf;
    int n=256;
    char *end;
    unsigned long *length;
    /* if (argc != 2)
    {
    printf("Usage: %s srcfile/n", argv[0]);
    exit(1);
    }
    */
    filename = "c://test.iso";
    if ((get_file_size(filename, &size)) == -1) //得到文件的大小
    {
    perror("get file size" );
    exit(1);
    }
    if ((buf = (char *)malloc(sizeof(char)*(size+1))) == NULL)
    {
    perror("malloc buf" );
    exit(1);
    }
    if ((fp = fopen(filename, "rb" )) == NULL) //读文件
    {
    perror("fopen file" );
    exit(1);
    }
    if ((n = fread(buf, 1, size, fp)) < 0) //读文件失败
    {
    perror("fread file" );
    exit(1);
    }
    sql = (char *)malloc(sizeof(char)*n*2+256); //2n+1+strlen(other sql)
    if (sql == NULL)
    {
    perror("malloc sql" );
    exit(1);
    }
    conn = mysql_init(NULL);//生产一个mysql对象
    if (conn == NULL)
    {
    printf("init mysql, %s/n", mysql_error(conn));
    exit(1);
    }
    if ((mysql_real_connect(conn, host, username, password, database, port, NULL, 0)) == NULL) //连接服务器
    {
    printf("connect mysql, %s/n", mysql_error(conn));
    exit(1);
    }
    strcpy(sql, "insert into www(id, name, file) values(NULL, 'peter', " );
    end = sql;
    end += strlen(sql); //point sql tail
    //convert NUL(ASCII 0)、'/n'、'/r'、'/''、'''、'"'和Control-Z and so on
    *end++ = '/'';
    end += mysql_real_escape_string(conn, end, buf, n);
    *end++ = '/'';
    *end++ = ')';
    flag = mysql_real_query(conn, sql, (unsigned int)(end-sql));
    if (flag != 0)
    {
    printf("insert failed, %s/n", mysql_error(conn));
    exit(1);
    }
    if ((mysql_real_query(conn, "SELECT file FROM www where id=1", 31)) != 0)
    {
    printf("insert failed, %s/n", mysql_error(conn));
    exit(1);
    }
    res_set = mysql_store_result(conn);
    fclose(fp);
    fp = NULL;
    fp = fopen("c://123.iso", "wb" );
    while ((row = mysql_fetch_row(res_set)) != NULL)
    {
    length = mysql_fetch_lengths(res_set);
    for (i=0; i<mysql_num_fields(res_set); i++)
    {
    fwrite(row[0], 1, length[0], fp);
    //printf("%s/n",row[0]);
    }
    }
    fclose(fp);
    mysql_close(conn);
    free(sql);
    free(buf);
    sql = NULL;
    return 0;
    }

    运行结果:

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七网广告
    零七网广告
    零七网广告
    零七网广告