Blob Bild im Browser

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
SimpleSebi
User
Beiträge: 8
Registriert: Mittwoch 6. Mai 2009, 14:26

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
SimpleSebi
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:

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 ()
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
SimpleSebi
User
Beiträge: 8
Registriert: Mittwoch 6. Mai 2009, 14:26

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?
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

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^^
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
SimpleSebi
User
Beiträge: 8
Registriert: Mittwoch 6. Mai 2009, 14:26

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.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ahem, ``nc localhost 8000 < request.txt``. SCNR
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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? :)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Sehr guter Hinweis, war mir entfallen.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Dieses TIMTOWTDI ist mir sowieso zu Perl-ish ;)
Antworten