记录上传文件到mysql数据库中遇到的问题

在开发一个Qt的界面程序,想把程序批量生成的数据文件上传进数据库中。

最开始尝试将文件读到QByteArray类型的变量中,插入数据表的mediumblob类型里,但是插不了,数据表结果一直是NULL空。

尝试数据流QDataStream也不行,程序直接存入少量数据可以,可能是文件太大,数据库放不下。查看配置,将my.ini配置文件中的max_allowed_packet大小改大点,比文件大,原来配置文件里最大只能16M,改成40M,数据表项类型改longblob,结果传入还是NULL。

查看资料有https://blog.csdn.net/qq_45927266/article/details/119297840,用load_file()上传文件,语法

SELECT LOAD_FILE('C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/pic/11.jpg') AS RESULT;

感觉可试,结果是空。

根据该文章查看secure_file_priv

show variables like 'secure_file_priv';

值为NULL,表示禁止文件的导入与导出。值为某一目录,表示只能对该目录下的文件导入与导出。值为空,表示不对文件的读写进行限制。

我的secure_file_priv的值是一个地址,修改my.ini配置文件,在[mysqld]下添加条目secure_file_priv =

仍然为空,看到需要重启mysql,试了重启语句 systemctl restart mysql.service 不好使,又查了几个重启语句都不执行。看到一个说可以在我的电脑右键中的管理的服务里停止mysql,再重启。。。然后我停止mysql服务后,无法重启mysql了。。。

查看资料有https://zhuanlan.zhihu.com/p/357774092,解决过程相当于重新安装了mysql,原来的数据库没有了,但是有mysql啊,所以可以接受,过程如下:

1、在mysql的安装目录里,我的是(C:\Program Files\MySQL\MySQL Server 8.0),bin同级目录下原来没有data文件夹,新创建了一个。

2、以管理员身份打开命令行窗口,我配置了环境变量可以在任意位置,没配置环境变量在bin目录下执行命令

mysqld –initialize

3、安装mysql服务

mysqld --install mysql

4、启动服务

net start mysql

5、登录数据库,此时MySQL初始化后,生成了一个初始随机密码,在data文件夹下后缀为.err的文件。

mysql –u root -p

找到密码,输入密码

可登录成功。

6、重设密码

alter user 'root'@'localhost' identified by 'root'; 

最后面这root是我设的新密码,设置后刷新权限

flush privileges;

数据库回来后,想起来我的最初目的,是让secure_file_priv值为空,表示不对文件的读写进行限制。原来是一个地址,现在改了配置文件,我又查看了show variables like 'secure_file_priv';

值为NULL,表示禁止文件的导入与导出。

各种尝试也不知道怎么把secure_file_priv值改变,往下试其他方法吧,下面的load data local infile

SHOW GLOBAL VARIABLES LIKE 'local_infile';

我的显示不可用,得改成可用

SET GLOBAL local_infile = true;

再试语句

load data local infile 'D:\11.txt' into table user;

不可行,这个可能是导入数据库文件的,不符合我的需求。

再试我原来的代码,成功了。。。

数据表类型longblob
存入数据类型QByteArray

查看大小,重新安装后看max_allowed_packet大小,反而变的更大了,有60多M,比我在配置文件里写的40M还大。

show global variables like 'max_allowed%';

文件上传到数据库问题解决了,感觉上是重新安装mysql数据库解决的。也可能是接受的大小要再大点。

c++ qt 上传代码

void xx::insertFileData(QString fileName, QString filePath, QString type)
{
    // 获取文件
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly))
        return;
    // 将文件转换成二进制数据
    QByteArray fileAll = file.readAll();

     //保存到数据库中
    QSqlQuery queryInsert;
    queryInsert.prepare("INSERT INTO `xxx-files`(FileName,type,file,creatDate) VALUES(:FileName, :type, :file, :creatDate);");
    queryInsert.bindValue(":FileName", fileName);
    queryInsert.bindValue(":type", type);
    queryInsert.bindValue(":file", fileAll);
    queryInsert.bindValue(":creatDate", QDateTime::currentDateTime());
    bool res = queryInsert.exec();
    if (!res)
    {
        qDebug() << queryInsert.lastError().text();
    }
}

上传到数据库中的文件再读取出来

void xx::downLoadFile()
{
    QSqlQuery query;
    bool result = query.exec("select * from `xxx-files`;");
    QByteArray readData;
    query.next();
    //while (query.next())
    //{
    //    qDebug() << query.value("name").toString();
    //    qDebug() << query.value("file").toString();
    //    readData = query.value("file").toByteArray();
    //}
    readData = query.value("file").toByteArray();
    qDebug() << query.lastError().text();

    QFile writefile("D:\\MAXSim7.1.1\\Data\\TKB\\write.tkb");
    if (!writefile.open(QIODevice::WriteOnly))
        return;
    writefile.write(readData);
    writefile.close();
}

可以读出来,之前用QDataStream类型写文件,写出的文件前有几个乱码,不用QDataStream,直接写速度也很快,且没有乱码。

posted @ 2022-10-18 15:52  yangly  阅读(95)  评论(0编辑  收藏  举报