Bild per PHP ausgeben - wie??
Drathy
- php
Hallo zusammen!
Ich scheitere grad daran, ein Bild per PHP auszugeben. Ich habe es 'normal' versucht per:
echo "<img src="PFAD ZUR BILDDATEI" ";
Leider erfolglos.
Ich denke das Problem lag daran, dass das Bild in einem Ordner abgelegt ist, auf den nur PHP Zugriff hat, sprich ich kann diesen Ordner nicht mit einer direkten URL ansprechen...
Daher meine Frage nun: Wie kann ich mittels PHP die Datei anzeigen lassen?
Ich hatte es auch schon erfolglos mit fopen und fread versucht, aber da wurde mir anstatt einer Bilddatei nur ne Menge Zeichensalat ausgegeben...
Wäre super, wenn mir jemand helfen könnte...
Viele Grüße,
Drathy
hi,
Ich scheitere grad daran, ein Bild per PHP auszugeben. Ich habe es 'normal' versucht per:
echo "<img src="PFAD ZUR BILDDATEI" ";
Leider erfolglos.Ich denke das Problem lag daran, dass das Bild in einem Ordner abgelegt ist, auf den nur PHP Zugriff hat, sprich ich kann diesen Ordner nicht mit einer direkten URL ansprechen...
Gut kombiniert :-)
Daher meine Frage nun: Wie kann ich mittels PHP die Datei anzeigen lassen?
Ich hatte es auch schon erfolglos mit fopen und fread versucht, aber da wurde mir anstatt einer Bilddatei nur ne Menge Zeichensalat ausgegeben...
Der Weg ist schon richtig - nur solltest du dann vor den Bilddaten per header() auch einen passenden Content-Type-Header ausgeben.
gruß,
wahsaga
Hi,
Der Weg ist schon richtig
Wobei: readfile() ist sicherlich noch "richtiger". ;-)
Gruß, Cybaer
Hallo!
Erst mal vielen Dank an alle bis hierher!
Also ich hab jetzt ne ganze Zeit probiert, aber es nich hinbekommen...immer noch Zeichensalat. Es folgt der entsprechende Code - was ist da falsch?
$bildquelle = $homedir."kunde1/Erstes Projekt/Entwuerfe/outfit3.jpg";
$bilddatei = fopen($bildquelle, "r");
$bild = fread($bilddatei, 27000);
fclose($bilddatei);
header("Content-type: image/jpeg");
echo "<table border="0" cellpadding="0" cellspacing="0"><tr><td style="width:650px;">";
require 'fileadmin/scripte/dl_liste.php';
echo "</td><td>";
echo "<img src="$bild">";
echo "</td></tr></table>";
Viele Grüße,
Drathy
hi,
Also ich hab jetzt ne ganze Zeit probiert, aber es nich hinbekommen...immer noch Zeichensalat. Es folgt der entsprechende Code - was ist da falsch?
Das komplette Prinzip.
echo "<img src="$bild">";
Wenn dein Browser ein "normales" Bild laden soll - schreibst du dann die binären Bilddaten etwa auch in das src-Attribut eines <img>-Elements?
Nein, tust du natürlich nicht. [1]
Sondern du verweist auf die Adresse, unter der der Browser das Bild vom Server anfordern soll.
Also mache das hier genauso.
gruß,
wahsaga
[1] Ja, mir ist bewusst, dass das unter bestimmten Umständen "möglich" ist. Praxistauglich ist es sicher nicht.
@Sichfred:
Natürlich bin ich Deinem Link ins Archiv gefolgt!
Aus dem Post habe ich folgendes geschlossen und auf meinen Fall angewendet:
Aufgrund des echo $data; habe ich dann vermutet, dass das, was scr aus bild.php übergeben bekommt, bzw. was für src wichtig für den Aufruf ist, der Inhald von $data ist, weshalb ich bei mir gleich dort die Variable habe ausgeben lassen... (hoffe Beschreibung ist nachvollziehbar)
Wo ist denn der Unterschied, wenn ich $data als Ausgabe von bild.php ausgebe oder das Ganze direkt mache? Das schnall ich grad nicht...
@wahsaga:
Ich dachte durch den header wird bewirkt, dass das Bild als Datei und nicht als Binärdaten weitergegeben wird?
Wie verweise ich denn dann auf die entsprechende Adresse?
Nochmals Danke & Gruß,
Drathy
Hell-O!
Also ich hab jetzt ne ganze Zeit probiert, aber es nich hinbekommen...immer noch Zeichensalat. Es folgt der entsprechende Code - was ist da falsch?
Schau dir mal an, was du hier überhaupt machst:
$bildquelle = $homedir."kunde1/Erstes Projekt/Entwuerfe/outfit3.jpg";
$bilddatei = fopen($bildquelle, "r");
$bild = fread($bilddatei, 27000);
Was steht nun in $bild ...
echo "<img src="$bild">";
... was du hier ausgibst? Übrigens, wärst du dem Link zu meinem Archivposting gefolgt, wüsstest du, wo es klemmt.
Siechfred
Moin Drathy,
Ich denke das Problem lag daran, dass das Bild in einem Ordner abgelegt ist, auf den nur PHP Zugriff hat, sprich ich kann diesen Ordner nicht mit einer direkten URL ansprechen...
hier auf die "Schnelle" ein Codeschnipsel:
<?PHP
$base_dir="D:\\APPS\\dutix\\data\\cia_images";
$filename="";
$filesize=0;
$fp=false;
$filename = $base_dir."\\".$_GET['file'];
$fp = fopen ($filename, "rb");
if ($fp)
{
$filesize = filesize ($filename);
header ("Content-Type: image/gif");
header ("Content-Length: ".$filesize);
header ("Cache-control: private");
fpassthru($fp);
fclose($fp);
}
?>
Spiele mal damit rum.
regds
Mike©
Hell-O!
Daher meine Frage nun: Wie kann ich mittels PHP die Datei anzeigen lassen?
http://forum.de.selfhtml.org/archiv/2005/8/t113707/#m722322
Siechfred
Moin Drathy,
Daher meine Frage nun: Wie kann ich mittels PHP die Datei anzeigen lassen?
wenn Du den von mir geposteten Codeschnipsel in eine Datei packst z.Bsp: open_image.php, dann lautet der Aufruf für das Bild "test.gif" so:
<img src="open_image.php?file=test.gif">
Zeigt mir jedenfalls das Bild einwandfrei an.
regds
Mike©
Hi Mike!
Leider auch damit kein Erfolg, das Bild wird nicht angezeigt, allerdings habe ich das Script auch etwas geändert, um meine entsprechenden Pfade aufzurufen, hoffe das ist so richtig. Hier mein Code in bild.php:
<?PHP
$base_dir="/var/cache/webs/kdxxx/";
$filename="";
$filesize=0;
$fp=false;
$filename = $base_dir."/".$_GET['file'];
$fp = fopen ($filename, "rb");
if ($fp)
{
$filesize = filesize ($filename);
header ("Content-Type: image/gif");
header ("Content-Length: ".$filesize);
header ("Cache-control: private");
fpassthru($fp);
fclose($fp);
}
?>
Der Aufruf:
echo "<img src="fileadmin/scripte/bild.php?file=kunde1/Erstes Projekt/Entwuerfe/outfit3.jpg">";
Oh mann, ich werd gleich bekoppt... ;-)
Moin Drathy,
Leider auch damit kein Erfolg, das Bild wird nicht angezeigt, allerdings habe ich das Script auch etwas geändert, um meine entsprechenden Pfade aufzurufen, hoffe das ist so richtig. Hier mein Code in bild.php:
<?PHP
$base_dir="/var/cache/webs/kdxxx/";$filename="";
$filesize=0;
$fp=false;$filename = $base_dir."/".$_GET['file'];
$fp = fopen ($filename, "rb");
if ($fp)
{
$filesize = filesize ($filename);header ("Content-Type: image/gif");
header ("Content-Length: ".$filesize);
header ("Cache-control: private");fpassthru($fp);
fclose($fp);
}?>
Der Aufruf:
echo "<img src="fileadmin/scripte/bild.php?file=kunde1/Erstes Projekt/Entwuerfe/outfit3.jpg">";
Ich muss leider erst mal wech. Auf die Schnelle kann ich noch sagen, das Du ein jpg anforderst, aber im header sagst Content-Type: image/gif
Kann bitte jemand weiter helfen, wie gesagt ich muß wech.
regds
Mike©
Ups, Flüchtigkeitsfehler...an dem es aber leider nicht lag...
Gruß,
Drathy
Ich hab noch mal ein wenig weiter probiert und mir die Werte einiger Variablen ausgeben lassen.
Irgendwie wird aus dem Aufruf
<img src="fileadmin/scripte/bild.php?file=kunde1/Erstes Projekt/Entwuerfe/outfit3.jpg">
das was nach dem '?' steht, anscheinend nicht mit übergeben.
Ich habe es daraufhin dann mal "von Hand" angegeben, also fopen mit dem exakten Pfad aufgerufen, aber da wurde anscheinend ne Endlosschleife oder so produziert, jedenfalls war der Browser am laden, aber es wurde nix angezeigt...
Hmm...also ne Endlosschleife wird doch nicht produziert...es dauert einige Sekunden, aber dann zeigt er den Zeichensalat der Datei an...
Was mir nun noch aufgefallen ist, und was ich nicht ansatzweise verstehe: Direkt vor dem Zeichensalat werden noch 3 Dateinamen + Link angezeigt, obwohl da laut Script nichts stehen dürfte.
Hier ein Teil der Ausgabe:
/var/cache/webs/kd500004/kunde1/Erstes Projekt/Entwuerfe/outfit3.jpg
outfit3.jpg
outfit2.jpg
outfit.jpgÿØÿàZEICHENSALAT
Und hier der Code dazu:
$base_dir="/var/cache/webs/kd500004/";
$pfad = "kunde1/Erstes Projekt/Entwuerfe/outfit3.jpg";
$filename = $base_dir.$pfad; //$_GET['file'];
echo $filename;
$fp = fopen ($filename, "r");
Kann mir das bitte jemand erklären?? Ich verzweifel hier gleich...
Gruß,
Drathy
Oh mann, was vermiss ich hier ne Editier- und Löschfunktion!!! ;-)
Also, in den letzten beiden Posts hab ich Mist erzählt...ich kann auch nicht mehr klar denken bei den geschätzten 500000°C im Büro hier!!!
Also aktueller Stand ist, dass anscheiend der Parameter, der im Image-Aufruf übergeben werden soll, nicht übergeben wird...
Aber selbst dann, wenn ich den Pfad zum Bild von Hand eingebe, wird das Bild nicht angezeigt...ich versteh das nicht... :(((
Hi,
Aber selbst dann, wenn ich den Pfad zum Bild von Hand eingebe, wird das Bild nicht angezeigt...ich versteh das nicht... :(((
Das kann man ja nicht mit ansehen! =;-)
Minimalste Version:
<?php
// show.php
$path='/var/cache/webs/kdxxx/';
$file=(!empty($_REQUEST['file']))?($path.'/'.$_REQUEST['file']):'';
if(is_file($file)) {
header ("Content-Type: image/gif");
readfile($file);
}
?>
http://www.example.com/show.php?file=pic.gif
Und beachte bitte, daß URL-Parameter zu escapen sind und daß Sonderzeichen (auch Leerzeichen) ggf. ebenfalls passend zum System umgewandelt werden müssen.
Gruß, Cybaer
Moin, moin zusammen!
Nochmal danke für Eure Hilfebemühungen!!! Leider neuer Tag, altes Spiel... :(
@Mike: An "rb" hat es nicht gelegen...
@Cybaer: Meine Aufruf des Bildes sieht ja folgendermaßen aus:
echo "<img src="fileadmin/scripte/bild.php?file=kunde1/Erstes Projekt/Entwuerfe/outfit3.jpg">";
Ich hoffe, dass ist bei Deinem Lösungsansatz auch ok so?
Jedenfalls bin ich nicht 100%ig sicher, was Du mit dem escapen der Parameter und den Sonderzeichen meinst... Spielst Du damit auf die Funktion urlencode() an? Sollte ich das dann nach folgendem Muster Handhaben:
$url = urlencode(fileadmin/scripte/bild.php?file=kunde1/Erstes Projekt/Entwuerfe/outfit3.jpg);
echo "<img src="$url">";
Viele Grüße,
Drathy
Hi,
Jedenfalls bin ich nicht 100%ig sicher, was Du mit dem escapen der Parameter und den Sonderzeichen meinst... Spielst Du damit auf die Funktion urlencode() an? Sollte ich das dann nach folgendem Muster Handhaben:
$url = urlencode(fileadmin/scripte/bild.php?file=kunde1/Erstes Projekt/Entwuerfe/outfit3.jpg);
Den URl-Parameter solltest Du so encoden (also alles nach dem ?).
Und BTW (wo es sich um das "Erste Projekt" handelt): Vermeide generell Sonderzeichen in Dateinamen. Das gilt nicht nur für Umlaute ("ü"->"ue") sondern auch für Leerzeichen (" "->"_", also "Erstes_Projekt" oder "ErstesProjekt"). Generell sollte man sogar auf Großbuchstaben verzichten. *nix ist da sehr penibel, Windows sehr schlampig. Wenn man generell klein schreibt, dann kommt es nicht zu versehentlichen Inkonsistenzen bei der Arbeit mit unterschiedlichen Systemen.
Gruß, Cybaer
Hi!
Leider immer noch ohne Erfolg... :(
Ich hab nun Folgendes gemacht:
Zunächst ein neues Verzeichnis erstelllt und eine Datei reingeladen (jeweils per eigenem Script) mit dem Pfad: /var/cache/webs/kdxxx/kunde1/projekt/Entwuerfe/kommu.jpg
Dann:
$parameter = "kunde1/projekt/Entwuerfe/kommu.jpg";
$parameter = urlencode($parameter);
Und:
echo "<img src="fileadmin/scripte/bild.php?file=$parameter">";
Hoffe das ist soweit richtig...
Dazu in der bild.php Folgendes:
<?PHP
$path='/var/cache/webs/kdxxx/';
$file=(!empty($_REQUEST['file']))?($path.'/'.$_REQUEST['file']):'';
if(is_file($file)) {
header ("Content-Type: image/jpeg");
readfile($file);
}
?>
Ergebnis: Es wird das Bildsymbol von <img> angezeigt, aber nicht das Bild...
Hab ich noch was falsch gemacht? Oder wo kann das Problem liegen? Find das Ganze echt komisch...
Eine Möglichkeit wäre ja noch, dass ich einen Fehler in meinem Upload-Script, mit dem ich die Datei hochlade, habe, aber das würde micht stark wundern, denn alle anderen selbst erstellten Funktionen (Datei löschen, verschieben, anzeigen) funktionieren wunderbar...
Gruß,
Drathy
Hi,
$path='/var/cache/webs/kdxxx/';
$file=(!empty($_REQUEST['file']))?($path.'/'.$_REQUEST['file']):'';
Oops, im Ergebnis ein "/" zuviel (zw. $path und file)!
Gruß, Cybaer
Leider war auch das nicht das Problem...immer noch kein Bild... :(
Kann es vielleicht an einer Servereinstellung haken? Oder vielleicht doch an meinem Upload? Der Download funktioniert allerdins auch bestens...
Moin Drathy,
Dazu in der bild.php Folgendes:
<?PHP
$path='/var/cache/webs/kdxxx/';
$file=(!empty($_REQUEST['file']))?($path.'/'.$_REQUEST['file']):'';
if(is_file($file)) {
header ("Content-Type: image/jpeg");
readfile($file);
}
?>
es wird Zeit die Sache mal systematisch anzugehen. Bitte überprüfe doch mal Schritt für Schritt.
Bitte versuche mal den/die Fehler einzugrenzen. Setze auch das Error Reporting auf E_ALL
regds
Mike©
Also:
Da echo ja nicht ausgegeben wurde, da sich der Aufruf der bild.php ja in nem <img>-Tag befindet, habe ich das Ganze etwas umgestrickt, hoffe, ich habe keinen Denkfehler drin...
Anstelle des <img> steht nun: require 'fileadmin/scripte/bild.php';
bild.php wurde wie folgt geändert:
<?php
$path='/var/cache/webs/kd500004/';
// $file=(!empty($_REQUEST['file']))?($path.$_REQUEST['file']):'';
$file = $path.'kunde1/projekt/Kommunikation/kommu.jpg';
echo $file.'<br>';
echo is_file($file).'<br>';
echo readfile($file);
if(is_file($file)) {
header ("Content-Type: image/jpeg");
readfile($file);
}
?>
Nun Folgendes:
Wenn ich error_reporting(E_ALL); setze, dann bekomm ich nur folgende Zeile auf den Bildschirm:
Die Grafik "http://www.jeschke.net/typo3/index.php?id=3" kann nicht angezeigt werden, weil sie Fehler enthält.
Ohne error_reporting(E_ALL); werden mir folgende Ergebnisse ausgegeben:
echo $file: /var/cache/webs/kdxxx/kunde1/projekt/Kommunikation/kommu.jpg
echo is_file($file): 1
echo readfile($file): Ganz viel Zeichensalat...
Oder kann ich mir auf anderer Art die Inhalte der Variablen ausgeben lassen, wenn sich der Aufruf innerhalb eines <img>-Tags befindet?
Gruß,
Drathy
Moin Drathy,
bitte erstelle folgende bild.php:
<?PHP
$filesize=0;
$fp=false;
$filename = '/var/cache/webs/kd500004/kunde1/projekt/Kommunikation/kommu.jpg';
$fp = fopen ($filename, "rb");
if ($fp)
{
$filesize = filesize ($filename);
header ("Content-Type: image/jpeg");
header ("Content-Length: ".$filesize);
header ("Cache-control: private");
fpassthru($fp);
fclose($fp);
}
else
{
echo "Kein Pointer";
}
?>
und in deinem Aufrufenden Script das:
<img src="bild.php">
regds
Mike©
Hi Mike!
Habe die Datei exakt so erstellt...der Aufruf dann mit:
echo "<img src="fileadmin/scripte/bild.php">";
Und siehe da: DAS BILD IST SICHTBAR!!! *freu*
Erstmal 1000 Dank!
Nun wüsste ich aber echt gerne, wo das Problem war?? Denn der Ansatz ist ja so wie der aus Deinem gestrigen "Code-Schnipsel"...
Viele Grüße,
Drathy
Moin Drathy,
Nun wüsste ich aber echt gerne, wo das Problem war?? Denn der Ansatz ist ja so wie der aus Deinem gestrigen "Code-Schnipsel"...
Anscheinend hängt es irgendwo mit der Übergabe des Dateinamen.
Aber das kannst Du sicher, Schritt für Schritt, selbst heraus finden.
Schön das wir Erfolg hatten. *FREU*
regds
Mike©
Hi Mike!
Ja, daran wird es wohl gelegen haben!
Ich werde nun mal das Script Step-by-Step durcharbeiten um meine gemachten Fehler zu finden und daraus zu lernen, und dann werde ich damit rumprobieren um es an meine Bedürfnisse anzupassen... (hoffe nicht, dass Ihr deswegen allzu bald hier von mir hören werdet... ;-))
Echt super, dass es nun klappt war echt eine schwere Geburt für so ein doch recht simples Problem... *NOCHMEHRFREU*
Also nochmals vielen, vielen Dank an alle, die sich darüber den Kopf zerbrochen haben und ganz besonderen Dank an Dich für die Lösung des Problems!!!
Viele Grüße,
(ein glücklicher) Drathy
Moin Drathy,
(ein glücklicher) Drathy
Hmmm, Du bist ein "Er". Wenn ich das gewusst hätte, dann hätte ich nicht soviel Zeit investiert. ;-)
*LOL* Wer lesen kann ist klar im Vorteil. Ich hatte Darthy gelesen (assoziiert).
Und BTW, das grundsätzliche Problem war, dass Du 2 Lösungsansätze gemischt hast (Cybaer, welcher bestimmt auch zum gewünschten Ergebnis geführt hätte), und nicht nur einem davon konsequent gefolgt bist.
Natürlich sei hier auch Siechfreds Archive Link erwähnt.
regds
Mike©
Jup, ein "Er" bin ich...^^
Was die Lösungsansätze angeht, muss ich Dir zustimmen. Teilweise bin ich da selbst durcheinandergekommen mit den 3 Ansätzen...aber ich wollte halt alles probieren und jede Möglichkeit nutzen, um das Ziel zu erreichen... :)
Wünsche ein schönes Wochenende!!!
Gruß,
Drathy
Hallo.
Minimalste Version
Und superster Lativ.
MfG, at
Moin Drathy,
$fp = fopen ($filename, "r");
Kann mir das bitte jemand erklären?? Ich verzweifel hier gleich...
in meinem Codeschnipsel stand nicht nur "read" sondern "read binary"
$fp = fopen ($filename, "rb");
regds
Mike©
Hi Mike!
Damit hatte ich es auch zunächst probiert...ich werde es morgen aber nochmals testen...
Gruß,
Drathy
Moin Drathy,
...ich werde es morgen aber nochmals testen...
ich glaube das ist eine gute Idee ;-) *SCHWITZ*
regds
Mike©