ubuntuusers.de

php Script: Bilder anzeigen statt Script downloaden

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

ascie

Anmeldungsdatum:
10. Juni 2010

Beiträge: 59

Hallo,

ich möchte in php - Scripts Bilder, die in der MySQL Datenbank gespeichert sind, im Browser (FF ) ansehen. SQL Verbindung, Abfragen etc., das paßt auch alles prima und gibt keine Probleme.

Aber: Man muß dem FF ja sagen, daß es sich nun um ein Bild handelt, was er aus der Datenbank darstellen soll, statt Text; dies geschieht wohl mit

header('content-type:image/jpeg')

oder analog gif etc.

Sobald ich nun das php Script aufrufe - s. Codebeispiel - fragt mich FF, ob und wo ich die Datei speichern möchte. Natürlich will ich das nicht. - Die Anzeige von jpeg/gifs etc., die direkt aus dem localhost Verzeichnis stammen, oder verlinkt mit anderen Sites im Web, werden korrekt dargestellt; der FF kann´s also.

$result2 = mysql_query($frage2) ;

if (!$result2) {
	die('ungültige Abfrage : ' . mysql_error()) ;	
	}
$row2 = mysql_fetch_row($result2) ;	
$data = mysql_result($result2, 0, "bin-data") ;
$type = mysql_result($result2, 0, "filetype") ;	

// header('Content-type: $type');
echo $row2[0];
echo $row2[1];
echo $row2[5];
echo $type ; 
echo $data  ;

Achtung: Nur Auszug ! MySQL Verbindung etc. gehen ja ....

Der "Bösewicht" ist also die Header Anweisung. Klammere ich diese aus, bekomme ich den Feldinhalt binär dargestellt. Lasse ich´s drin, will FF das Script eben downloaden + speichern.

Irgendwo muß ich also php ( Apache ? ) noch irgendwas sagen. Nur was und wo ?

Installiert hab ich den Apache Server, MySQL und php5 ( phpinfo() sagt 5.3.2 )

Höre gern,

Gruß ascie

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

du musst auf alle Fälle drauf achten, dass die header-Anweisung das erste ist, was raus geht. Image/jpeg stimmt, wenn es JPEG ist. Außerdem musst du die doppelten "Gänsefüsschen" verwenden.

header("content-type: $type");

PS: willst du nicht besser eine HTML-Datei draus machen? du kannst dann noch "Dinge" einbauen um weiter zu klicken oder um das Bild anzupassen (nur so eine Frage)

ascie

(Themenstarter)

Anmeldungsdatum:
10. Juni 2010

Beiträge: 59

Nein, das ist´s nicht wirklich :

<?php
header("Content-type: image/jpeg");

also wirklich ganz oben,( 2. Zeile nach Scriptbeginn ) ergibt, egal ob mit einfachen oder doppelten ", daß das Script lediglcih seinen eigenen Namen ausgibt + sonst gar nichts. - ( Der Einfachheit hab ich mal die $type Anw. rausgenommen, in der echten Tabelle sind gif/jpeg gemischt, daher die Type Abfrage ).

Immerhin, er will nix mehr laden, aber warum arbeitet er das Script nicht ab ?

Scriptfehler eigentlich ausgeschlossen: Kommentiere ich die header Anweisung raus mit // , so arbeitet das Script perfekt ...

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Irgendwie verwirren mich deine zusätzlichen echo-Statements hier:

ascie schrieb:

// header('Content-type: $type');
echo $row2[0];
echo $row2[1];
echo $row2[5];
echo $type ; 
echo $data  ;

Du willst doch das Bild ausgeben, oder? Was sind das dann für andere Felder außer den Binärdaten, die du da ausgibst? Lass das doch mal weg und reduziere es auf die Ausgabe des Headerfeldes und des Bildes.

Wenn auch das nicht geht, mach mal ein künstliches Beispiel. Sowas:

1
2
3
<?php
header("Content-Type: image/jpeg");
echo file_get_contents("test.jpg");

(Natürlich eine test.jpg an geeigneter Stelle platzieren.)

Wenn das geht, dann arbeite dich mal langsam und schrittweise vor. Erst nur Verbindung zur Datenbank einfügen; dann Bild auslesen, aber nicht ausgeben; dann Bild auch ausgeben. Vielleicht findest du ja so den Fehler.

Geht aber schon dieses minimale Beispiel nicht, dann stimmt bei dir was ganz anderes nicht, glaube ich.

ascie

(Themenstarter)

Anmeldungsdatum:
10. Juni 2010

Beiträge: 59

Hi Vain,

die anderen $row[x] Ausgaben sind weitere Abfragefelder aus der Tabelle, reiner Text. ($type und $ data ergeben sich aus dem Beispiel). Wird auch so dargestellt.

Das eigentliche Bild steht in $row[5]. Das wird auch alles korrekt ausgelesen, das ist nicht das Problem: Die Datenbankverbing etc ist in Ordnung. Das Script ohne header - Anweisung zeigt sogar den binären Inhalt richtig an - nur eben binär.

Deine

echo file_get_contents("test.jpg");

Anweisung führte zum selbem Ergebnis wie heute um 19:29 h dargestellt .... Nochmal das ganze php-Script zur besseren Erläuterung . ( mySQL Verbindung hier durch * erstzt ):

<?php
# header("Content-type: image/jpeg");
echo file_get_contents("Apfel.jpeg") ;

$db_link = mysql_connect('***', '***', '***');
if ( $db_link )									// SQL Verbingung erfolgreich ??
{
    echo 'Verbindung '  ;							// dann sag´s !
    echo $db_link ;
    echo ' erfoglreich ';
}
$db_selected = mysql_select_db ('***', $db_link); 

echo '<p><img src="Apfel.jpeg" width="30" height="30" alt="Apfel.jpeg" /></p>';   // Ausgabe der Datei "Apfel.jpeg", dier hier im Verz. liegt
echo "<br><br>Aha !" ;                                                            // Ausgabe Test - Text
			
$frage2='Select * from yyy where yyy=yyy ';                                      // Abfrage definieren: yyy hier aus Sicherheitsgründen
			
$result2 = mysql_query($frage2) ;                                                 // SQL abfragen

if (!$result2) {                                                                  // erfolgreich ?
	die('ungültige Abfrage : ' . mysql_error()) ;	                          // Nein ---> dann stirb !  
	}
$row2 = mysql_fetch_row($result2) ;	
$data	= mysql_result($result2, 0, "bin-data") ;
$type = mysql_result($result2, 0, "filetype") ;	


# header("Content-type: image/jpeg");
echo $row2[0];
echo $row2[1];
echo $row2[5];

?>

Lasse ich das so laufen, ( mit auskommentierter Header-Zeile ! ) kommt ein Ergebnis lt. anl. Screenshot. Das Bildchen, das auf der Platte liegt, wird korrekt angezeigt. Nehme ich den Kommentar beim Header fort, wird lediglich der Name ( inkl. Pfad ) des aufrufenden Scripts ausgegeben. - Wie gesagt, MySQL ist nicht das Problem.

Bilder

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Du verstehst da etwas miss, glaube ich. Pro Skriptaufruf kannst du nur genau ein Bild im Rohformat zurückgeben. Du scheinst HTML und Rohbild mischen zu wollen, das geht nicht.

Dass du nur den Dateinamen siehst, heißt, dass das mit dem header() geklappt hat. Dein Browser versteht, dass ein Bild kommt. Aber dann schickst du ihm nicht nur ein Bild, sondern noch weitere Daten – das ist also nicht mehr ein Bild. 😉 Der Firefox zeigt ein Bild, das er nicht anzeigen kann, halt sinnigerweise dadurch an, dass er dir den Pfad ausgibt…

Weiß nicht, wie ich das genauer erklären soll, ohne allzu weit ausholen zu müssen. Vielleicht schaust du dir noch einmal die Basics an und machst dir klar, was pro Aufruf des Skriptes (und damit pro HTTP-Request) durch die Leitung geht und welche Bedeutung das hat.

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

... das sehe ich auch so. So nach und nach erfährt man, was dein Script in Wirklichkeit so alles macht.

Ich empfehle dir trotzdem noch, den HTML-Ansatz zu wählen: versuche HTML zu erzeugen. Dafür ist der Browser ja da. Da kannst du Text - ein Bild oder viele Bilder u.s.w flexibel rein bauen, Links zum Weiterblättern ...

Das kannst du auch erst mal "als statische Datei im Browser angucken und dann das notwendige HTML per Script erzeugen und Schritt für Schritt testen.

ascie

(Themenstarter)

Anmeldungsdatum:
10. Juni 2010

Beiträge: 59

Hi,

tja, das ist also der Rätsels Lösung: php - Scripte stellen pro Script max. 1 Bild dar; HTML dagegen beliebig viele. Richtig ? Richtig ! - Also das Ergebnis der SQL Abfrage per Parameter an HTML übergeben & in HTML darstellen & weitermachen - ( Übergabe an HTML ... die nächste Lesarbeit also : Wie übergeben die Parameter an HTML ? Die php Variablen enden doch mit "?> " ) Naja ....

Gott, sind das ein gräßliche Sprachen !

Jedenfalls danke-schön an euch 2 für Hilfe + Lösung.

Gruß, ascie

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Ich meld mich doch noch mal:

Das hat nix mit PHP-Script zu tun. Auf der HTTP-Connection mit dem MIME-Type jpeg erwartet der Empfänger (hier der Browser) einen Komplettinhalt 'jpeg' - und das ist nun mal ein Bild. Mehrere Bilder kann der Browser nur anzeigen, wenn er HTML interpretiert. Das musst du ihm aber als HTML-schicken - nicht mit dem MIME-Type jpeg.

Wo hast du Probleme bei den Parameter aus der Datenbank?

Wenn du die Parameterwerte ins HTML einbauen willst, musst du Dein HTML z.B. per 'echo' erzeugen. Die PHP-Einbauten im HTML können beliebig oft vorkommen.

Nehmen wir an das sei die Datei beispiel.php auf dem Server:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Beschreibung der Seite</title>
</head>
<body>

<?php
  $VAR="HAENSEL UND GRETEL";

  ...
?>

<b>Da kommt wieder mal ein Text in HTML</b>
...

<?php

  echo "<i>Das war in der Variablen $VAR </i><br>\n"
?>

und so weiter

</body>
</html>

ascie

(Themenstarter)

Anmeldungsdatum:
10. Juni 2010

Beiträge: 59

Hei theinlein,

das ist natürlcih richtig, was Du schreibst, sofern Dein Beispiel als *.php abgespeichert ist; bei *.html geht die $var verloren ... - Interessant wäre es aber, $var eben im html - Block darzustellen: Sprich in beiden Bereichen, php und html, Zugriff darauf zu haben.

However, meine Ursprungsfrage ist gelöst, und mit dieser Erkenntnis gibt´s eben kein Bild aus der DB-Tabelle ....

Antworten |