Seite 1 von 1
Blob Bild im Browser
Verfasst: Montag 18. Mai 2009, 13:34
von SimpleSebi
Hallo,
ich versuche gerade ein Bild, das als Blob in einer MySQL Datenbank gespeichert habe, im Browser auszugeben.
Dafür habe ich mir folgendes Skript geschrieben, dass einen DB select macht und des dann ausgibt. Leider funktioniert das nicht, das Skript zeigt nur die URL als Bild an, nicht aber das Bild.
print 'content-type: image/'+suffix
print
print binaer_bild
Die Variablen binaer_bild und suffix kommen aus der DB. Am DB select kann das Problem nicht liegen, da die Variable binaer_bild im text/html Mime ein voller Array ist(also nicht leer). Auch suffix wird richtig aus der DB geholt.
Weis jemand, was ich falsch mache?
Gruß,
Sebastian
Verfasst: Montag 18. Mai 2009, 21:03
von sma
Das Bild als URL? Wie soll das funktionieren? Wer wandelt da einen String in ein Bild von welchem Format um? Oder meinst du, du sieht einen Text mit der URL statt des Bilds?
Einfach nur der suffix funktionert übrigens bei jpeg nicht. Da heißt es nämlich image/jpeg (mit e) aber die Bilder haben üblicherweise die gute alte DOS-kompatible 3-Buchstabenendung jpg. Könnte das dein Problem sein?
Dann fügt dir das dritte Print noch ein \n oder \r\n unter Windows an. Das werden Browser unter umständen gar nicht mögen. Desweiteren würden automatisch unter Windows \x0a innerhalb des Bilders als \r\n ausgegeben. Das wird garantiert nicht funktionieren. Nimm besser
import sys
sys.stdout.write(binaer_bild)
zur Ausgabe von Binärdaten.
Stefan
Verfasst: Dienstag 19. Mai 2009, 06:33
von SimpleSebi
Hallo Stefan,
danke für deine Hilfe, es hat trotzdem nicht geklappt.
Hier ist die URL:
http://sslomski.alfahosting.org/sslomski/image.py?id=1
Wie man sieht wurde der Text irgendwie in ein Bild umgewandelt....
Und hier nochmal der ganze Code:
Code: Alles auswählen
#!/usr/bin/python
import cgi
import cgitb; cgitb.enable()
import MySQLdb
import sys
conn = MySQLdb.connect (host = "localhost",
user = "admin",
passwd = "admin",
db = "db_2")
cursor = conn.cursor()
form = cgi.FieldStorage()
if form.has_key('id'):
id = form['id'].value
cursor.execute("select bild, suffix from content where id = "+id)
row = cursor.fetchone()
print "content-type: image/"+row[1]
print
sys.stdout.write(row[0])
cursor.close ()
conn.close ()
Verfasst: Dienstag 19. Mai 2009, 06:42
von BlackJack
Der Text wurde nicht in ein Bild umgewandelt. Hättest Du ganz einfach feststellen können wenn Du mal Teile von dem Text mit der Maus ausgewählt hättest.
Und ein Blick in den Quelltext der ausgelieferten Seite:
Code: Alles auswählen
Traceback (most recent call last):
File "image.py", line 24, in ?
sys.stdout.write(row[0])
TypeError: argument 1 must be string or read-only character buffer, not array.array
Verfasst: Dienstag 19. Mai 2009, 08:56
von SimpleSebi
Hallo,
BlackJack hat geschrieben:Der Text wurde nicht in ein Bild umgewandelt. Hättest Du ganz einfach feststellen können wenn Du mal Teile von dem Text mit der Maus ausgewählt hättest.
Bei mir verhält sich der Text aber wie ein Bild.
BlackJack hat geschrieben:
Und ein Blick in den Quelltext der ausgelieferten Seite:
Code: Alles auswählen
Traceback (most recent call last):
File "image.py", line 24, in ?
sys.stdout.write(row[0])
TypeError: argument 1 must be string or read-only character buffer, not array.array
wie kommst du den an diese Fehlermeldung?
Verfasst: Dienstag 19. Mai 2009, 11:22
von apollo13
SimpleSebi hat geschrieben:Hallo,
BlackJack hat geschrieben:Der Text wurde nicht in ein Bild umgewandelt. Hättest Du ganz einfach feststellen können wenn Du mal Teile von dem Text mit der Maus ausgewählt hättest.
Bei mir verhält sich der Text aber wie ein Bild.
Aber wie ein kaputtes^^
Verfasst: Dienstag 19. Mai 2009, 13:15
von Y0Gi
SimpleSebi hat geschrieben:wie kommst du den an diese Fehlermeldung?
Wie er schrieb: Den "Quelltext" der "Seite" im Browser ansehen. Im Fall von Firefox geht das über den Shortcut Strg-U.
Hintergrund ist, dass das Script einen Fehler wirft, allerdings schon den Bild-Header gesendet hat. Die Fehlermeldung landet dann auf STDOUT oder STDERR - jedenfalls igendwas, das an den Browser übergeben wird. CGI als Schnittstelle liest letztlich von STDIN und gibt alles an den Client weiter, was das Programm an STDOUT schreibt.
Verfasst: Dienstag 19. Mai 2009, 16:09
von SimpleSebi
Hallo,
Y0Gi hat geschrieben:
Wie er schrieb: Den "Quelltext" der "Seite" im Browser ansehen. Im Fall von Firefox geht das über den Shortcut Strg-U..
Da der Header ja schon gesendet wurde stellt Firefox bei mir ein Bild dar und blockiert deshalb die Quelltext-anzeige Funktion.
Verfasst: Dienstag 19. Mai 2009, 16:56
von Y0Gi
Ich habe gerade kein kaputtes CGI-Script zur Hand, aber ich bin sicher, dass es seinerzeit bei mir anders war.
Du kannst mit der "Live HTTP Headers"-Extension verfolgen, welche Daten da empfangen werden, oder "manuell" mit `telnet` oder `nc` (netcat) einen Request (s. HTTP bei Wikipedia) auf der Konsole absetzen und dir die Antwort ansehen. Gerade letzteres sollte sich recht einfach halb-automatisieren lassen, indem man den Request in einer Textdatei ablegt und mit Konsolenmechanismen wie `cat request.txt | nc localhost 8000` übermittelt.
Verfasst: Dienstag 19. Mai 2009, 17:05
von Leonidas
Ahem, ``nc localhost 8000 < request.txt``. SCNR
Verfasst: Dienstag 19. Mai 2009, 21:51
von Y0Gi
Hab' ich grad 'n Deja-vu?

(Vor allem hab' ich hier keine französischen Accents ...)
Hätte mein Einzeiler denn wenigstens funktioniert und ist nur uncooler?

Verfasst: Mittwoch 20. Mai 2009, 09:50
von sma
Ich mag ja ``curl -i address`` denn das zeigt Header und Body der HTTP-Response auf stdout an und kann mit weiteren Parametern Requests für alle HTTP-Methoden abschicken, Parameter übergeben usw.
Stefan
Verfasst: Mittwoch 20. Mai 2009, 13:10
von Y0Gi
Sehr guter Hinweis, war mir entfallen.
Verfasst: Mittwoch 20. Mai 2009, 16:35
von derdon
Y0Gi hat geschrieben:Hab' ich grad 'n Deja-vu?

(Vor allem hab' ich hier keine französischen Accents ...)
Hätte mein Einzeiler denn wenigstens funktioniert und ist nur uncooler?

Er ist uncooler. Ich sag nur: useless use of cat
Verfasst: Freitag 22. Mai 2009, 13:07
von Y0Gi
Dieses TIMTOWTDI ist mir sowieso zu Perl-ish
