fopen() Bild trotz mode "rb" in ASCII dargestellt! (win)
Hase
- php
Hallo!
Folgendes Problem:(aufgetreten im Internet Explorer +Windows+ Apache2)
$filename="bild.jpg";
$fd = fopen ($filename, "rb");
fpassthru($fd);
fclose($fd);
Eine Textfile mit $fopen() zu öffnen ist kein Problem!
Aber: Wenn ich versuche ein Bild zu öffnen, wird dieses zwar geöffneet, aber nur als Zeichensalat dargestellt!
Und dies obwohl ich "b" für binary als Modus für fopen dazugefügt habe!!?
Ich kann die File öffnen und als Bild darstellen lassen, wenn ich
header("Content-type: image/".jpeg); ganz am Anfang des Scripts einfüge!
Aber dann wird nichts mehr anderes angezeigt, also ein gemischter Seiteninhalt Text/Bild scheint damit nicht möglich?!
Mit einer Include Datei besteht das Problem weiterhin!
Kann mir wer helfen, bzw. woran könnte das liegen und was mache ich falsch?
mfg
Hase
Hallo du Hase,
Kann mir wer helfen, bzw. woran könnte das liegen und was mache ich falsch?
dein gesamter Denkansatz ist falsch.
Du musst so denken: Du kannst einem Browser mit einem Aufruf nur eine Datei zurückgeben. Du kannst also nicht
<html><body>
<h1><?=$_GET["blabla"]; ?></h1>
<img src="<?=$fd; ?>">
schönes bild
</body></html>
schreiben und denken, du hättest dein $fd=fopen("bild") nun wiedergegeben. Um korrekt Bilder mit PHP auszugeben, solltest du am besten die gd-library nutzen. Wenn du das Bild nichtmal ändern willst, dann kannst du das alles sogar in einer Date machen, und zwar z.B. so:
<?
if(!isset($_GET["action"]):
?>
<html>
blablablabla
<img src="?action=image1" />
<img src="?action=image2" />
<?
else:
header("Content-type: image/".jpeg);
switch($_GET["action"]):
case "image1": $im = @ImageCreateFromJPEG ("bildnummer1.jpg"); break;
case "image2": $im = .... ("bildblablabla2....jpg");
endswitch;
imagejpeg ($im);
?>
Das gibt dir z.B: alles korrekt wieder. GD-Library brauchst du allerdings dazu.
Bambel
header("Content-type: image/".jpeg);
Wieso nicht header('Content-type: image/jpeg');?
switch($_GET["action"]):
case "image1": $im = @ImageCreateFromJPEG ("bildnummer1.jpg"); break;
case "image2": $im = .... ("bildblablabla2....jpg");
endswitch;
imagejpeg ($im);
Was spricht gegen die bereits vorgestellte Lösung mit fpassthru() oder etwa readfile()?
hi,
header("Content-type: image/".jpeg);
Wieso nicht header('Content-type: image/jpeg');?
oops, druchfehler. Sorry, ich hatte keine Lust, es selbst zu schreiben, habe mir dieses header-teil aus dem PHP-Manual rausgeschnitten. Natürlich ist dein teil richtig.
switch($_GET["action"]):
case "image1": $im = @ImageCreateFromJPEG ("bildnummer1.jpg"); break;
case "image2": $im = .... ("bildblablabla2....jpg");
endswitch;
imagejpeg ($im);
Was spricht gegen die bereits vorgestellte Lösung mit fpassthru() oder etwa readfile()?
ehhmmmm - weil er dann text ausgeben will, und kein bild ...!?
Bambel
Thx für die Antworten!
Das mit dem Schreibfehler ist klar, ging aber komischerweise trotzdem: Also halt NUR das Bild!! Danach kommt nix mehr anderes!
Aber offenbar kann man damit NICHT ein BILD innerhalb einer HTML Seite anzeigen lassen??
Habe mich täuschen lassen, dachte mit fpassthru() kann man ein Bild ausgeben fopen() mit dem mode "rb" - read und dahinter das "b" für binär... und DANACH oder DAVOR beliebige Text Zeichen möglich, mit z.B. einer ANDEREN fopen() Anweisung....
Denke aber Bambel hat recht, so etwas geht am besten mit <img scr="")
mfg
Hase
hi,
Aber offenbar kann man damit NICHT ein BILD innerhalb einer HTML Seite anzeigen lassen??
wenn du eine "normale", statische html-seite erstellst - dann mischst du doch auch nicht html-code und binäre bilddaten in _einer_ datei durcheinander, oder?
nein, du machst eine datei, die den html-code enthält - und benutzt darin <img>, über dessen src-attribut du auf eine _andere_ datei, die bilddatei eben, verweist.
genau so musst du hier auch vorgehen. (*)
du kannst natürlich
<img src="meinscript.php" ...>
verwenden, wobei meinscript.php dann den entsprechenden header und die binären bilddaten ausgibt - allerdings dann natürlich wiederum _nur_ die bilddaten.
gruss,
wahsaga
(*) kleine ergänzung: es gibt die möglichkeit, bilder direkt "inline" in eine seite einzufügen, dabei werden die bilddaten in base64-kodierung direkt in der html-seite notiert. allerdings kann damit nur der netscape/mozilla etwas anfangen.
bei interesse: näheres siehe http://aktuell.de.selfhtml.org/artikel/grafik/inline-images/index.htm
Moin Moin !
fpassthru($fd);
Was steht zur Binärsicherheit der fpassthru-Funktion im PHP-Manual? Bastelt diese Funktion an Zeilenumbrüchen und / oder Sonderzeichen rum? Das sollte sie nicht tun.
Den Ausgabestrom solltest Du ebenfalls auf Binärmodus einstellen, falls PHP das nicht selbst schon macht.
header("Content-type: image/".jpeg);
Das ist definitiv falsch.
header("Content-type: image/jpeg");
Danach den binären Datenstrom der JPEG-Datei weiterleiten (fpassthru o.ä.), und danach AUF GAR KEINEN FALL auch nur ein einziges weiteres Zeichen (Zeilenumbruch etc) ausgeben.
Alexander