Seite 1 von 2

QPixmap Upload mit QFtp?

Verfasst: 11. März 2009 16:03
von blenderman
Hallo Miteinander,

ich möchte ein Pixmap als Bilddatei (png) auf einem FTP Server speichern. Das Programm läuft bis zum erstellen des Ordners "Test". Nach einer kurzen Pause stürzt es dann ab. Ist die Lösung über den Buffer falsch? Oder stimmt die Syntax noch nicht?

Code: Alles auswählen

 
QByteArray bytes;
QBuffer buffer(&bytes);
buffer.open(QIODevice::WriteOnly);
originalPixmap.save(&buffer, "PNG", 20);


 QFtp *ftp = new QFtp();
     ftp->connectToHost("ftp.xxxx.de");
     ftp->login("xxxx","xxxx");
     ftp->mkdir("test");
     ftp->cd("test");
     ftp->put(&buffer, "test.png" );
     ftp->close();
Vielen Dank für eure Hilfe,
Oli

Verfasst: 11. März 2009 16:09
von androphinx
ich habe mich damit noch nicht damit beschäftigt, aber ich hätte es über ein QFile gemacht, weil schließlich isses ja ne datei....

Mfg androphinx

Verfasst: 11. März 2009 16:17
von blenderman
Wow, danke für die schnelle Antwort!

Ist der Buffer also nicht die richtige Lösung? Ich hatte mir damit erhofft lokales speichern der Bilddatei zu sparen.

Grüße,
Oli

Verfasst: 11. März 2009 16:27
von androphinx
aahh, sorry hatte deinen code schnell überflogen. hmmm, ok, ist doch eigentlich richtig gedacht, etwas komisch aber richtig....

lasse dir den inhalt von buffer mal vor dem senden ausgeben, mach das am besten mit nem stinknormalen text, den du dann als textdatei überträgst....

ansonsten kannste noch versuchen die daten mittels buffer.data() auszulesen...

Mfg androphinx

Verfasst: 11. März 2009 16:49
von blenderman
Du bist echt schnell. Vielen Dank. Hab jetzt den buffer.data() in ein Textlabel geschrieben. In der ersten Zeile ein Strich dann PNG und in der zweiten Zeile ein Quadrat. :lol:

Code: Alles auswählen

ui->label->setText(buffer.data());
Grüße,
Oli

Verfasst: 11. März 2009 17:17
von Christian81
http://doc.trolltech.com/4.4/qftp.html#put

Du kannst also nicht davon ausgehen dass nach 'ftp->put(&buffer, "test.png" ); ' schon alles hochgeschickt wurde.

Verfasst: 11. März 2009 17:21
von androphinx
jo christian hat recht. die funktion wird noch länger ausgeführt... du musst auf das signal commandFinished() warten...

Mfg androphinx

Verfasst: 12. März 2009 15:17
von blenderman
Hallo ihr zwei,

kommt also der ftp close Befehl zu früh? Wenn ich den close befehl wegglasse stürzt das Programm trotzdem ab. Oder habe ich euch falsch verstanden und benötige weiteren Code unter commandFinished()? Ein leeres untiteld.txt über QFile funktioniert bei mir ohne commandFinished().

Das Pixmap ist nicht leer, es wird lokal erfolgreich gespeichert. Der Teil mit dem Buffer sollte auch stimmen. http://doc.trolltech.com/4.5/qpixmap.html#save

mfg,
Oli

Verfasst: 12. März 2009 15:20
von Christian81
Dein buffer wird schon gelöscht aber es sind noch nicht alle Daten hochgeladen worden. Du musst sicherstellen (wie auch die Doku sagt) dass der buffer so lange gültig ist bist QFtp fertig gemeldet hat.

Verfasst: 12. März 2009 15:30
von blenderman
Dachte das ist ein Forum, kein Chat. :D Spitzenmäßige Unterstützung. Dankeschön.

Verfasst: 12. März 2009 23:23
von blenderman
Ich geb mich geschlagen. Wie stelle ich sicher das der Buffer während der Operation erhalten bleibt?

Verfasst: 13. März 2009 06:32
von Christian81
Ich würde einfach mal mit C++ und einer Klasse anfangen...

Verfasst: 13. März 2009 10:32
von Strahlex
Das funktioniert garantiert nicht, die QFtp ist eine gethreadete Klasse, so wie alle anderen Netzwerkklassen in Qt auch.
Schau dir doch mal die FTP Example an.

PS: würde eher QFile verwenden

Verfasst: 13. März 2009 10:37
von Christian81
Strahlex hat geschrieben:Das funktioniert garantiert nicht, die QFtp ist eine gethreadete Klasse,[/url]
Was soll nicht funktionieren?
Strahlex hat geschrieben: PS: würde eher QFile verwenden
Wieso erst eine tempoäre Datei anlegen??

Verfasst: 13. März 2009 10:50
von Strahlex
Christian81 hat geschrieben: Wieso erst eine tempoäre Datei anlegen??
Wer sagt was von einer temporären Datei, da er ja sowieso eine png Uploaden will kann er das doch direkt machen und nicht umständlich über den Buffer.