Bild aus Datenbank (blob) direkt darstellen

Alles rund um die Programmierung mit Qt
Antworten
Garfyld
Beiträge: 5
Registriert: 11. April 2007 16:27

Bild aus Datenbank (blob) direkt darstellen

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Garfyld
Beiträge: 5
Registriert: 11. April 2007 16:27

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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])
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Garfyld
Beiträge: 5
Registriert: 11. April 2007 16:27

Beitrag 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 ...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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).
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Re: Bild aus Datenbank (blob) direkt darstellen

Beitrag 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;
             */
    
}

.........................
speack português italiano deutsch english castellà qt
Garfyld
Beiträge: 5
Registriert: 11. April 2007 16:27

Beitrag 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.
Antworten