Seite 1 von 1

Bild aus Datenbank (blob) direkt darstellen

Verfasst: 12. April 2007 10:36
von Garfyld
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

Verfasst: 12. April 2007 10:56
von Christian81
Ist doch schon richtig -> BLOB -> QByteArray -> QPixmap::loadFromData ( const QByteArray &, ...)
Von BLOB nach QByteArray ist wohl nicht so schwer wenn man sich dioe Doku mal anschaut.

Verfasst: 12. April 2007 14:51
von Garfyld
Christian81 hat geschrieben: Von BLOB nach QByteArray ist wohl nicht so schwer wenn man sich dioe Doku mal anschaut.
... 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).

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

Verfasst: 12. April 2007 14:53
von Christian81
Was macht str() ? Ich schätze mal das macht deine Daten kaputt. rawData braucht wirklich die unveränderten Daten... also etwas in der Form
previewData.fromRawData(result[0])

Verfasst: 12. April 2007 16:23
von Garfyld
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 ...

Verfasst: 12. April 2007 16:26
von Christian81
QByteArray::fromRTawData() braucht keinen String sondern einen Pointer auf die Daten des Blobs + die Länge der Daten des Blobs (siehe auch Doku).

Re: Bild aus Datenbank (blob) direkt darstellen

Verfasst: 12. April 2007 17:31
von patrik08
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;
             */
    
}


Verfasst: 13. April 2007 10:40
von Garfyld
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).
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.

@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.