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
Blob Bild im Browser
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
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
-
- User
- Beiträge: 8
- Registriert: Mittwoch 6. Mai 2009, 14:26
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:
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 ()
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:
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
-
- User
- Beiträge: 8
- Registriert: Mittwoch 6. Mai 2009, 14:26
Hallo,
Bei mir verhält sich der Text aber wie ein Bild.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.
wie kommst du den an diese Fehlermeldung?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
Aber wie ein kaputtes^^SimpleSebi hat geschrieben:Hallo,Bei mir verhält sich der Text aber wie ein Bild.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.
Wie er schrieb: Den "Quelltext" der "Seite" im Browser ansehen. Im Fall von Firefox geht das über den Shortcut Strg-U.SimpleSebi hat geschrieben:wie kommst du den an diese Fehlermeldung?
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.
-
- User
- Beiträge: 8
- Registriert: Mittwoch 6. Mai 2009, 14:26
Hallo,
Da der Header ja schon gesendet wurde stellt Firefox bei mir ein Bild dar und blockiert deshalb die Quelltext-anzeige Funktion.Y0Gi hat geschrieben: Wie er schrieb: Den "Quelltext" der "Seite" im Browser ansehen. Im Fall von Firefox geht das über den Shortcut Strg-U..
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.
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.
Er ist uncooler. Ich sag nur: useless use of catY0Gi 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?