Bild aus Datenbank (blob) direkt darstellen
Bild aus Datenbank (blob) direkt darstellen
Hallo,
ich möchte gerne Bilddateien (z.B. jpg), die in einer Datenbank als BLOB gespeichert sind, darstellen. Derzeit lade ich sie herunter, speichere sie auf Platte und dann lade sie dann wieder als ein Pixmap. Das genze funktioniert zwar, es muss doch aber auch ohne den Umweg Speichern-auf-Platte-und-wieder-lesen geben. Hat da jemand eine Idee?
Meine Überlegungen gehen derzeit in die Richtung, die Binärdaten (aus dem BLOB) so "umzuwandeln", dass beispielsweise die QPixmap-Funktion loadfromData sie verwenden kann. Das wäre dann ein QByteArray, aber erstens weiß ich gerade nicht wie ich meine Bilddaten in das Bytearray umwandeln soll und zweitens ob das überhaubt ein praktikabler Weg ist.
Also wenn jemand einen Vorschlag hat, würde mich das freuen.
Danke
ich möchte gerne Bilddateien (z.B. jpg), die in einer Datenbank als BLOB gespeichert sind, darstellen. Derzeit lade ich sie herunter, speichere sie auf Platte und dann lade sie dann wieder als ein Pixmap. Das genze funktioniert zwar, es muss doch aber auch ohne den Umweg Speichern-auf-Platte-und-wieder-lesen geben. Hat da jemand eine Idee?
Meine Überlegungen gehen derzeit in die Richtung, die Binärdaten (aus dem BLOB) so "umzuwandeln", dass beispielsweise die QPixmap-Funktion loadfromData sie verwenden kann. Das wäre dann ein QByteArray, aber erstens weiß ich gerade nicht wie ich meine Bilddaten in das Bytearray umwandeln soll und zweitens ob das überhaubt ein praktikabler Weg ist.
Also wenn jemand einen Vorschlag hat, würde mich das freuen.
Danke
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
... doch, genau da hänge ich gerade. Vielleicht stehe ich auch einfach auf´m Schlauch. Nebenbei bemerkt programmierte ich in Python (und wie es scheint vermisse ich da gerade das erste mal den Direkten Umgang mit Zeigern).Christian81 hat geschrieben: Von BLOB nach QByteArray ist wohl nicht so schwer wenn man sich dioe Doku mal anschaut.
Jedenfalls laufen Versuche wie:
previewData = QtCore.QByteArray()
previewData.fromRawData(str(result[0]))
zwar (result[0] sind dabei direkt die binären (blob-) Daten), aber funktionieren tut es dann doch nicht. Also ist die Konvertierung so wohl falsch.
Hat vielleicht jemand kongrete Vorschläge?
Danke
Steffen
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
str() erstellt einen string. In der Doku steht ja, dass fromRawData einen string entgegen nimmt (warum auch immer):
QByteArray QByteArray.fromRawData (str)
Lasse ich das str() weg, kommt die Fehlermeldung:
TypeError: argument 1 of QByteArray.fromRawData() has an invalid type
Es scheitert also wirklich daran, die blob-daten in ein "vernünftiges" Datenformat umzuwandeln, bzw. sie direkt so als Bildinformationen verwenden zu können.
Naja, wenn es nicht klapt, habe ich ja immernoch meine oben beschriebene Lösung über den Dateiumweg. Eleganter wäre es allerdings schon ...
QByteArray QByteArray.fromRawData (str)
Lasse ich das str() weg, kommt die Fehlermeldung:
TypeError: argument 1 of QByteArray.fromRawData() has an invalid type
Es scheitert also wirklich daran, die blob-daten in ein "vernünftiges" Datenformat umzuwandeln, bzw. sie direkt so als Bildinformationen verwenden zu können.
Naja, wenn es nicht klapt, habe ich ja immernoch meine oben beschriebene Lösung über den Dateiumweg. Eleganter wäre es allerdings schon ...
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: Bild aus Datenbank (blob) direkt darstellen
Garfyld hat geschrieben:Hallo,
ich möchte gerne Bilddateien (z.B. jpg), die in einer Datenbank als BLOB gespeichert sind, darstellen. Derzeit lade ich sie herunter, speichere sie auf
Also wenn jemand einen Vorschlag hat, würde mich das freuen.
Danke
Kommt darauf an wie sie in die DB rein sind..... normal so....
Code: Alles auswählen
QByteArray coond = query.value(7).toByteArray();
QString tmploadin = QString("%1curl/%2" ).arg(WORK_CACHEDIR).arg(filenamevieni);
QFile f(tmploadin);
if ( f.open( QIODevice::WriteOnly ) ) {
fsize = f.write(coond);
f.close();
if (fsize > 0) {
AppendImage(tmploadin,desctitel,direct_int(dbid));
/////qt_unlink(tmploadin);
}
}
Doch seit ich die zip && die Gunzip lib im qt habe ... nehme ich zum beisbiel 10 oder mehr bilder ... sogar ganze ordner in einen zip file ..
dann im toBase64 so dass auch ein Dump gut geht.... (alles eine line...)
so werden daten bis 90% comprimiert.... beim rausnehmen basedecode ... und die daten sind wieder da... nach dem unzip....
ein feld longblob geht aber bis MAX 2GB....
Code: Alles auswählen
void Db_Box::PackTakeZip( const QString file , int idmg )
{
if (!is_file(file)) {
QMessageBox::warning(0, tr("User File error"),tr("User id %2 not found a valid file %2.").arg(file).arg(idmg));
return;
}
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
QByteArray inside;
QFile f(file);
f.open(QIODevice::ReadOnly);
inside = f.readAll();
const QString blobzip = inside.toBase64();
const QString sd = QString("REPLACE INTO USERFILE_0 VALUES (%1, 'zip', 'attach' ,'%2',%3)")
.arg(idmg)
.arg(blobzip)
.arg(QTime_Null());
QSqlQuery query(db_0);
bool esx = query.exec(sd);
if (!esx) {
QApplication::restoreOverrideCursor();
QMessageBox::warning(0, tr("User File error"),tr("User id %2 file %1 DB insert fail! DB error %3")
.arg(file)
.arg(idmg)
.arg(query.lastError().text()));
}
f.close();
f.remove();
QApplication::restoreOverrideCursor();
/*
CREATE TABLE `USERFILE_0` (
`ID` int(32) NOT NULL default '0',
`TIPO` enum('zip','pdf','txt','doc') default NULL,
`TITEL` varchar(255) default NULL,
`PIC` longblob NOT NULL,
`EPOCHE` int(32) NOT NULL default '0',
PRIMARY KEY (`ID`),
UNIQUE KEY `ID` (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
*/
}
.........................
speack português italiano deutsch english castellà qt
speack português italiano deutsch english castellà qt
Stimmt da hast du recht. Das sagt jedenfalls die Qt-Doku für C++. In der PyQt-Doku (ich progge ja mit Python und bin bis jetzt begeistert von der Sprache) ist aber irgendwie die Rede von ..(str), was wohl daran liegen könnte, dass die Python-Strings semantisch den QByteArrays sehr ähnlich sind.Christian81 hat geschrieben:QByteArray::fromRTawData() braucht keinen String sondern einen Pointer auf die Daten des Blobs + die Länge der Daten des Blobs (siehe auch Doku).
@patrik08
ersteinmal ein dickes *Respekt* zu der Idee mit dem packen und dann hochladen. Und dann hast du mir auch so noch einen guten Hinweis gegeben. Derzeit lesen ich die Datei einfach mit Python-Methoden aus, die mir halt "irgendwelche" Binärdaten liefern ( f = open(file,"rb") und dann file_inhalt = f.read() ) die dann auch einfach so in dem DB-Blob-Feld landen. Vielleicht kann ich ja mal darauf umsteigen die Datei mit Qt-Methoden zu lesen, so dass dann über readAll() gleich QByteArray-Daten vorliegen. Das werde ich aber nicht sofort angehen, da ich derzeit andere Prioritäten setzen muss.
Und danke nochmals für eure Meldungen.