在網上找了一下關於如何在資料庫中隱藏檔本體(一般是關於image)的內容,但是發現大多數的做法都是隱藏檔相應的路徑,需要該檔案的時候通過路徑查詢,感覺那樣的做法的話,檔案只是在一種抽象的方式被儲存在了資料庫中,本體並沒有被儲存,這樣做可能是出於效率和資料庫大小的考慮(本人對資料庫知道的不多)。因為前段時間對QT比較感興趣,然後發現其中可以使用第三方的資料庫,於是嘗試了下。
(1)建立資料庫連接
bool MyDatabase::CreateConnection()
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mydb.db");
if (!db.open()) {
qDebug()<<" can't open database >>>>>> mydb.db";
exit(-1);
}
return true;
}
使用第三方資料庫Sqlite,資料庫名字為mydb.db,而後就是開啟資料庫了。
(2)建立儲存說需要的表
bool MyDatabase::CreateTable()
{
QStringList tableList = db.tables();
QSqlQuery query(db);
if(!tableList.contains("files"))
{
QString createTable = "create table files (id integer primary key,"
"filename varchar(128) unique, filecontent blob)";
if(!query.exec(createTable))
{
qDebug()<<query.lastError();
exit(-1);
}
}
return true;
}
查看是否存在相關的表,不存在,則通過"create table files (id integer primary key,filename varchar(128) unique, filecontent blob)";建立files表。
(3)隱藏檔名為
bool MyDatabase::StoreFile(QString FileName)
{
QSqlQuery query(db);
QFile File(FileName);
if(File.open(QIODevice::ReadOnly)){
QByteArray &tdata = File.readAll();
QByteArray data = qCompress(tdata,9);
query.prepare("INSERT INTO files (id,filename,filecontent)"
"VALUES(NULL,:filename,:filecontent)");
query.bindValue(":filename", FileName);
query.bindValue(":filecontent", data);
if(!query.exec())
{
qDebug()<<query.lastError();
return false;
}
}
else
{
return false;
}
return true;
}
基本思想就是把名為FileName的檔案裝換成為QByteArray,然後使用第三方的zlib進行最高等級的壓縮,然後儲存
(4)從資料庫中
bool MyDatabase::GetFile(QString FileName)
{
QSqlQuery query(db);
query.prepare("select filecontent from files");
query.exec();
query.next();
QByteArray tdata = query.value(0).toByteArray();
QByteArray data = qUncompress(tdata);
QFile File(FileName);
if(File.open(QIODevice::WriteOnly))
{
File.write(data);
File.close();
}
else
{
return false;
}
return true;
}
因為僅僅是嘗試,所以只需讀取一個並把它命名為FileName。基本思想是把儲存在資料庫中的內容轉化為QByteArray,然後解壓,寫入到檔案中。
本例僅是示範,希望對大家能夠有所協助。