数据上传,下载功能(一)

本文介绍了如何在MySQL数据库中实现数据的上传和下载功能,特别是针对二进制文件如图片和大文本。通过安装MySQL5.5、配置max_allowed_packet参数、使用SQLyog客户端,以及创建BLOB类型的数据库字段来存储二进制数据。在程序中,文件先被压缩再上传到数据库,下载时则从数据库解压并还原为本地文件。

最近实现一个小功能,按照需求完成数据的上传,下载功能.存储内容为一些图片和10M以内的文本,要求存储二进制格式,使用MySql数据库


1. 首先,安装数据库,在我自己的Win7的机器上安装MySql5.5数据库服务器,方便做实验

下载地址http://dev.mysql.com/downloads/repo/

2.安装.  安装目录C:\Program Files (x86)\MySQL

在安装目录下MySQL Server 5.5文件夹下,有很多ini配置文件,

my.ini是公用的配置文件,

my-large.ini和my-medium.ini和my-small.ini和my-innodb-heavy-4G.ini是根据数据库所安装的机器大小来自行选取的,MySql数据库默认是每次上传max_allowed_packet = 1M的(当初所有的四个配置文件都改成10M了但是还是上传不了大于1M的文件,后来我把这个max_allowed_packet = 10M添加到my.ini文件中,这才搞定,我猜,我目前的机器估计是它识别不出来是哪个类型,所以不知道用那个文件)

3.安装SQLyog,///////////////////////是一个sql数据库操作客户端,方便自己操作,查看结果.

4.设置SQLyog可被本机以外访问,     在数据库中新添加一个表,表中添加响应的字段,其中保存数据的为blob类型字段

MySQL数据库要想插入图片和二进制文件,其字段需要是BLOB类型。
BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
MySQL中,BLOB是个类型系列,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储文件的最大大小上不同。
//MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G

5. 前提都准备好了

6.开始写程序,连接数据库

.h文件

#include <QList>
#include <QMutex>
#include <QtSql/QSqlDatabase>
#include <QByteArray>
#include <QVector>

#include "dbmanager.h"

class MySQLManager : public DBManager
{
public:
	MySQLManager();
	~MySQLManager();

	static MySQLManager *Instance();//得到数据库操作类实例
	
	//登录验证
	virtual int QueryLogon(const QString& tbName, const QString& account, const QString& PWD = "");
	virtual bool insertData(const QString &datauser, const QString &datahost, const QString &dataname, const QString &datetime, const QByteArray &data, const QString &datadescription);
	virtual QVector<QStringList> selectData(const QString& sql);
	virtual QByteArray downData(const QString& sql);
	virtual bool delData(const QString& sql);
private:
	void InitDBXMLConfig();
	
private:
	QSqlDatabase m_db_mysql;
	QMutex m_db_lock;

	QString m_dbName;
	QString m_host;
	int m_port;
	QString m_user;
	QString m_passwd;
};

cpp文件

#include <QMessageBox>
#include <QFile>
#include <QDebug>
#include <QVariant>
#include <QDomDocument>
#include <QXmlStreamReader>
#include <QMutexLocker>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlRecord>
#include <QTime>
#include <QDateTime>

#include "MySQLManager.h"

MySQLManager::MySQLManager()
{
	InitDBXMLConfig();

	m_db_mysql = QSqlDatabase::addDatabase("QMYSQL","QMYSQL");
	m_db_mysql.setDatabaseName(m_dbName);
	m_db_mysql.setHostName(m_host);
	m_db_mysql.setPort(m_port);
	m_db_mysql.setUserName(m_user);
	m_db_mysql.setPassword(m_passwd);
	if (!m_db_mysql.open()) 
	{
		QSqlError err = m_db_mysql.lastError();
		m_db_mysql.close();
		QMessageBox::critical(NULL,tr("提示"),err.text());
	}
}

MySQLManager::~MySQLManager()
{
	if (m_db_mysql.isOpen())
	{
		m_db_mysql.close();
	}
}
连接数据库.

配置文件是InitDBXMLConfig()读取本地文件

QString filepath = QCoreApplication::applicationDirPath()+tr("/Config/DB.xml");
	QFile file(filepath);
	QXmlStreamReader  xmlReader;
	if(file.open(QFile::ReadOnly|QFile::Text))
	{
		xmlReader.setDevice(&file);
		QDomDocument pDomDoc;
		if (!pDomDoc.setContent(&file)) 
		{
			file.close();
			return;
		}
		QDomElement docElem = pDomDoc.documentElement();
		QDomNode n = docElem.firstChild();
		while (!n.isNull()) 
		{
			QDomElement e = n.toElement(); //将节点转换为元素
			if (!e.isNull()) 
			{
				if (e.attribute("name") == "dbName") m_dbName = e.attribute("value");
				else if (e.attribute("name") == "host") m_host = e.attribute("value");
				else if (e.attribute("name") == "user") m_user = e.attribute("value");
				else if (e.attribute("name") == "passwd") m_passwd = e.attribute("value");
				else if (e.attribute("name") == "port") m_port = e.attribute("value").toInt();
			}
			n = n.nextSibling();
		}
	}
	file.close();
7.数据库连接成功后,数据处理

插入数据,首先准备数据,数据思路是:界面上有个treeWidget显示数据,用户选择数据点击上传,可以给上传的数据添加三十个字以内的描述,,也可以在树表格中选择要下载的数据点击下载.上传之前,转化为而今文件压缩,下载到本地后解压后,在转化为本地文件.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值