Wie Dateien übergeben?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausschnitt
bearbeiten
break
browser
code
datei
funktionieren
header
http
idee
image
info
null
parameter
simplen quellcode
switch
text
type
url
verwendung
-
Hallo,
in PHP kann man ja mit include() Dateien einbinden, allerdings nur textbasierte Dateien, wenn ich es richtig verstanden habe.
1. Frage: Wie kann ich z. B. png-Dateien übergeben?
2. Frage: Ich habe mit include() eine Funktion eingebaut, dass zwei CSS-Dateien zu einer einzigen zusammengesetzt übergeben werden. Soweit funktioniert es scheinbar gut. Wenn ich die php-Datei allerdings mit<link href="datei.php?css=beide" rel="stylesheet" type="text/css">
einbinde, dann erkennt der Browser scheinbar nicht, dass es sich um eine angebliche CSS-Datei handelt. Wenn ich nämlich den Quelltext des Stylesheets in Firefox anzeigen lasse, zeigt er zwar den Text richtig an, aber z. B. mit Zeilennummerierung, die er bei normalen CSS weglässt. Wie kann ich also die Dateien zusammengesetzt übergeben, sodass dieser Fehler nicht auftritt?
Ausschnitt aus dem simplen Quellcode von datei.php:
if($_GET["css"]=="bt") { include("css/bootstrap-theme.min.css"); } elseif($_GET["css"]=="b") { include("css/bootstrap.min.css"); } elseif($_GET["css"]=="beide") { include("css/bootstrap.min.css"); echo("\n"); include("css/bootstrap-theme.min.css"); }
Ich dachte, das steht bestimmt an jeder Ecke im Internet, aber ich finde anscheinend nicht die richtigen Suchwörter …
Beitrag zuletzt geändert: 26.11.2015 20:15:45 von funnyweb -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo,
das sieht schon ganz gut aus, du hast nur vergessen, das dein Browser gerne noch wissen will, um was es sich bei dieser Datei handelt. Das weiß er derzeit noch nicht. Aber geben wir eine header-info mit, dann weiß dein Browser, dass es sich um ein css handelt ;)
header('Content-type: text/css'); if($_GET["css"]=="bt") { include("css/bootstrap-theme.min.css"); } elseif($_GET["css"]=="b") { include("css/bootstrap.min.css"); } elseif($_GET["css"]=="beide") { include("css/bootstrap.min.css"); echo("\n"); include("css/bootstrap-theme.min.css"); }
Das Zauberwort an der Stelle bei Google heißt: Dynamic Style Sheets
MFG Micha -
michaelkoepke schrieb:
Hallo,
Perfekt! Danke für deine schnelle Hilfe, das ist exakt die Antwort, die ich gesucht habe!!!
das sieht schon ganz gut aus, du hast nur vergessen, das dein Browser gerne noch wissen will, um was es sich bei dieser Datei handelt. Das weiß er derzeit noch nicht. Aber geben wir eine header-info mit, dann weiß dein Browser, dass es sich um ein css handelt ;)
header('Content-type: text/css'); if($_GET["css"]=="bt") { include("css/bootstrap-theme.min.css"); } elseif($_GET["css"]=="b") { include("css/bootstrap.min.css"); } elseif($_GET["css"]=="beide") { include("css/bootstrap.min.css"); echo("\n"); include("css/bootstrap-theme.min.css"); }
Das Zauberwort an der Stelle bei Google heißt: Dynamic Style Sheets
MFG Micha -
Andere Möglichkeit:
<link href=" <?php $css="beide"; include "datei.php";?> " rel=...
und der datei.php
if($css=="beide"){ echo("css/bootstrap-theme.min.css"); } if ...
Damit schreibt die datei.php den CSS-Link in deine PHP-Seite.
Übrigends: Durch die Verwendung von "switch($css)" wird dein PHP-Code der datei.php übersichtlicher.
Wenn du ein Bild in deine PHP-Seite einbauen möchtest, kannst du auch einfach
echo("<img src=' ".$Dateipfad." '>");
schreiben und schon steht es da wie im gewöhnlichem HTML.
Du kannst auch mit fopen() eine Datei öffnen um sie in PHP zu bearbeiten.
-
test42test schrieb:
Andere Möglichkeit:
Auch eine gute Idee! Vielen Dank, das probiere ich sofort mal aus … dann ist es noch weniger manipulationsanfällig.
<link href=" <?php $css="beide"; include "datei.php";?> " rel=...
und der datei.php
if($css=="beide"){ echo("css/bootstrap-theme.min.css"); } if ...
Damit schreibt die datei.php den CSS-Link in deine PHP-Seite.
Übrigends: Durch die Verwendung von "switch($css)" wird dein PHP-Code der datei.php übersichtlicher.
[…]
Edit: Kurze Frage noch – was ist daran falsch:
if(($_GET["img"]!=null)&&($_GET["img"]!="")) { $finfo = finfo_open(FILEINFO_MIME_TYPE); header('Content-type: '.finfo_file($finfo, "img/".$_GET["img"])); finfo_close($finfo); include ("img/".$_GET["img"]); }
Z. B. mit datei.php?img=smiley.jpg wird dann img/smiley.jpg angesteuert. Das funktioniert aber scheinbar nicht mit .jpg-Dateien, sondern nur mit .png …
Beitrag zuletzt geändert: 27.11.2015 20:36:21 von funnyweb -
Deine Header-Info ist wieder flasch.
jpg gibt es nicht! Es gibt nur jpeg! (als Herader-Info meine ich natürlich)
Ein kleiner Beispielcode von stackoverflow den du bei dir in dein Script einbauen solltest.
switch( $file_extension ) { case "gif": $ctype="image/gif"; break; case "png": $ctype="image/png"; break; case "jpeg": case "jpg": $ctype="image/jpeg"; break; default: }
Viel Spaß
Michael
Beitrag zuletzt geändert: 27.11.2015 8:53:32 von michaelkoepke -
test42test schrieb:
Das löst aber das Problem gar nicht - so wird ja nur eine Datei eingebungen und nicht noch eine 2. hintendran gehängt.
Andere Möglichkeit:
<link href=" <?php $css="beide"; include "datei.php";?> " rel=...
und der datei.php
if($css=="beide"){ echo("css/bootstrap-theme.min.css"); } if ...
Damit schreibt die datei.php den CSS-Link in deine PHP-Seite.
Ausschnitt aus dem simplen Quellcode von datei.php:
„include“ ist übrigens nicht so geschickt in diesem Fall, das bindet die Datei nämlich nicht nur ein, sonder führt sie auch aus. Es ist zwar unwahrscheinlich, dass in einer CSS Datei zufälligerweise gültiger PHP Code steht, aber für Deine Verwendung ist trotzdem eigentlich readfile gedacht.
if($_GET["css"]=="bt") { include("css/bootstrap-theme.min.css"); } elseif($_GET["css"]=="b") { include("css/bootstrap.min.css"); } elseif($_GET["css"]=="beide") { include("css/bootstrap.min.css"); echo("\n"); include("css/bootstrap-theme.min.css"); }
-
michaelkoepke schrieb:
Deine Header-Info ist wieder flasch.
Ich habe doch mit
jpg gibt es nicht! Es gibt nur jpeg! (als Herader-Info meine ich natürlich)
Ein kleiner Beispielcode von stackoverflow den du bei dir in dein Script einbauen solltest.
switch( $file_extension ) { case "gif": $ctype="image/gif"; break; case "png": $ctype="image/png"; break; case "jpeg": case "jpg": $ctype="image/jpeg"; break; default: }
Viel Spaß
Michael
$finfo = finfo_open(FILEINFO_MIME_TYPE); header('Content-type: '.finfo_file($finfo, "img/".$_GET["img"])); finfo_close($finfo);
den Mimetype automatisch erkennen lassen. Klar weiß ich, dass es kein image/jpg gibt, darum lasse ich ja auch extra den Mimetype ermitteln und sage nicht einfachheader('Content-type: image/'strtolower(substr(strrchr($_GET["img"],"."),1)));
Aber die Header-Info kann doch eigentlich nicht falsch sein, es sei denn, die Mimetype-Erkennung funktioniere hier bei lima-city bei manchen Dateitypen nicht korrekt, wovon ich nicht ausgehe. Von dem zitierten Script halte ich wenig, weil es leider überhaupt nicht allgemein gilt, sondern man jede Dateiendung selbst einbauen muss – und, falls eine Dateiendung fehlerhaft sein sollte, wird die Datei komplett unbrauchbar, weil der Mimetype falsch übermittelt wird. Trotzdem vielen Dank.
davidlw schrieb:
Ist mir auch aufgefallen. Würde es funktionieren, wenn ich sowas mache?:test42test schrieb:
Das löst aber das Problem gar nicht - so wird ja nur eine Datei eingebungen und nicht noch eine 2. hintendran gehängt.
Andere Möglichkeit:
<link href=" <?php $css="beide"; include "datei.php";?> " rel=...
und der datei.php
if($css=="beide"){ echo("css/bootstrap-theme.min.css"); } if ...
Damit schreibt die datei.php den CSS-Link in deine PHP-Seite.
<link href=" <?php $css="beide"; echo("datei.php");?> " rel=...
und in datei.phpif($css=="beide"){ readfile("css/bootstrap-theme.min.css"); echo("\n"); readfile("css/bootstrap.min.css"); }
Okay, tausend dank für den Tipp!
Ausschnitt aus dem simplen Quellcode von datei.php:
„include“ ist übrigens nicht so geschickt in diesem Fall, das bindet die Datei nämlich nicht nur ein, sonder führt sie auch aus. Es ist zwar unwahrscheinlich, dass in einer CSS Datei zufälligerweise gültiger PHP Code steht, aber für Deine Verwendung ist trotzdem eigentlich readfile gedacht.
if($_GET["css"]=="bt") { include("css/bootstrap-theme.min.css"); } elseif($_GET["css"]=="b") { include("css/bootstrap.min.css"); } elseif($_GET["css"]=="beide") { include("css/bootstrap.min.css"); echo("\n"); include("css/bootstrap-theme.min.css"); }
test42test schrieb:
Das ist ja aber beides nicht, was ich haben möchte … ich möchte erreichen, dass, wenn der Browser beispielsweise http://example.com/misc/datei.php?img=smiley.jpg aufruft, eine Bilddatei angezeigt bekommt. Komplett ohne HTML o. ä. …
[…]
Wenn du ein Bild in deine PHP-Seite einbauen möchtest, kannst du auch einfach
echo("<img src=' ".$Dateipfad." '>");
schreiben und schon steht es da wie im gewöhnlichem HTML.
Du kannst auch mit fopen() eine Datei öffnen um sie in PHP zu bearbeiten.
Beitrag zuletzt geändert: 27.11.2015 20:40:41 von funnyweb -
funnyweb schrieb:
Lass Dir doch einfach mal den ermittelten Mime-type per echo ausgeben oder schau Dir mit den Entwicklertools des Browsers den HTTP header an, einfach um zu sehen, ob der code auch funktioniert wie erwartet.
Ich habe doch mit
$finfo = finfo_open(FILEINFO_MIME_TYPE); header('Content-type: '.finfo_file($finfo, "img/".$_GET["img"])); finfo_close($finfo);
den Mimetype automatisch erkennen lassen. Klar weiß ich, dass es kein image/jpg gibt, darum lasse ich ja auch extra den Mimetype ermitteln und sage nicht einfachheader('Content-type: image/'strtolower(substr(strrchr($_GET["img"],"."),1)));
Aber die Header-Info kann doch eigentlich nicht falsch sein, es sei denn, die Mimetype-Erkennung funktioniere hier bei lima-city bei manchen Dateitypen nicht korrekt, wovon ich nicht ausgehe. Von dem zitierten Script halte ich wenig, weil es leider überhaupt nicht allgemein gilt, sondern man jede Dateiendung selbst einbauen muss – und, falls eine Dateiendung fehlerhaft sein sollte, wird die Datei komplett unbrauchbar, weil der Mimetype falsch übermittelt wird. Trotzdem vielen Dank.
davidlw schrieb:
Nein, das würde nicht funktionieren. Du musst hier die CSS Variable weiterhin per GET Request übergeben. Sonst ist die in "datei.php" zur Zeit der Ausführung nicht verfügbar.
Ist mir auch aufgefallen. Würde es funktionieren, wenn ich sowas mache?:test42test schrieb:
Das löst aber das Problem gar nicht - so wird ja nur eine Datei eingebungen und nicht noch eine 2. hintendran gehängt.
Andere Möglichkeit:
<link href=" <?php $css="beide"; include "datei.php";?> " rel=...
und der datei.php
if($css=="beide"){ echo("css/bootstrap-theme.min.css"); } if ...
Damit schreibt die datei.php den CSS-Link in deine PHP-Seite.
<link href=" <?php $css="beide"; echo("datei.php");?> " rel=...
und in datei.phpif($css=="beide"){ readfile("css/bootstrap-theme.min.css"); echo("\n"); readfile("css/bootstrap.min.css"); }
Okay, tausend dank für den Tipp!
Ausschnitt aus dem simplen Quellcode von datei.php:
„include“ ist übrigens nicht so geschickt in diesem Fall, das bindet die Datei nämlich nicht nur ein, sonder führt sie auch aus. Es ist zwar unwahrscheinlich, dass in einer CSS Datei zufälligerweise gültiger PHP Code steht, aber für Deine Verwendung ist trotzdem eigentlich readfile gedacht.
if($_GET["css"]=="bt") { include("css/bootstrap-theme.min.css"); } elseif($_GET["css"]=="b") { include("css/bootstrap.min.css"); } elseif($_GET["css"]=="beide") { include("css/bootstrap.min.css"); echo("\n"); include("css/bootstrap-theme.min.css"); }
test42test schrieb:
Das ist ja aber beides nicht, was ich haben möchte … ich möchte erreichen, dass, wenn der Browser beispielsweise http://example.com/misc/datei.php?img=smiley.jpg aufruft, eine Bilddatei angezeigt bekommt. Komplett ohne HTML o. ä. …
[…]
Wenn du ein Bild in deine PHP-Seite einbauen möchtest, kannst du auch einfach
echo("<img src=' ".$Dateipfad." '>");
schreiben und schon steht es da wie im gewöhnlichem HTML.
Du kannst auch mit fopen() eine Datei öffnen um sie in PHP zu bearbeiten.
Geht genauso per readfile. Komm aber bloß nicht auf die Idee einfach ein "readfile($_GET['img'])" zu machen, sonst kann jeder sämtliche Dateien auf deinem Webspace lesen, auch PHP Dateien mit Datenbank Passwörtern etc. Solche Parameter gehören IMMER überprüft! -
Sicher funktioniert das mit dem include und der Variable. Warum auch nicht? Variablen, die du definierst sind natürlich auch in einer inkludierten Datei verfügbar.
Du kannst aber in einem include keine GET-Parameter definieren. Ist ja auch kein eigener Request. -
muellerlukas schrieb:
Sicher funktioniert das mit dem include und der Variable. Warum auch nicht? Variablen, die du definierst sind natürlich auch in einer inkludierten Datei verfügbar.
Du kannst aber in einem include keine GET-Parameter definieren. Ist ja auch kein eigener Request.
Les dir vielleicht den infrage kommenden Code nochmal durch:
<link href=" <?php $css="beide"; echo("datei.php");?> " rel=...
Und jetzt denke noch einmal über deinen Post nach.
-
davidlw schrieb:
[…]
Der MimeType ist laut Firefox-Seiteninformationen korrekt – image/jpeg. Nur ist mir aufgefallen, dass die übermittelte Datei nur 156 Bytes groß ist, während die ursprüngliche Datei 147,0 KB wiegt. Woran kann das liegen?
Lass Dir doch einfach mal den ermittelten Mime-type per echo ausgeben oder schau Dir mit den Entwicklertools des Browsers den HTTP header an, einfach um zu sehen, ob der code auch funktioniert wie erwartet.
[…]
davidlw schrieb:[…]
Okay, dankeschön.
Nein, das würde nicht funktionieren. Du musst hier die CSS Variable weiterhin per GET Request übergeben. Sonst ist die in "datei.php" zur Zeit der Ausführung nicht verfügbar.
[…]
davidlw schrieb:[…]
Danke, deswegen habe ich jetzt folgendes geschrieben:
Geht genauso per readfile. Komm aber bloß nicht auf die Idee einfach ein "readfile($_GET['img'])" zu machen, sonst kann jeder sämtliche Dateien auf deinem Webspace lesen, auch PHP Dateien mit Datenbank Passwörtern etc. Solche Parameter gehören IMMER überprüft!
[…]
if(($_GET["img"]!=null)&&($_GET["img"]!="")) { $finfo = finfo_open(FILEINFO_MIME_TYPE); if(explode("/", finfo_file($finfo, "img/".$_GET["img"]))[0]=="image") { header('Content-type: image/'.explode("/", finfo_file($finfo, "img/".$_GET["img"]))[1]); finfo_close($finfo); include ("img/".$_GET["img"]); } }
aber es funktioniert immer noch nicht … -
funnyweb schrieb:
Danke, deswegen habe ich jetzt folgendes geschrieben:
if(($_GET["img"]!=null)&&($_GET["img"]!="")) { $finfo = finfo_open(FILEINFO_MIME_TYPE); if(explode("/", finfo_file($finfo, "img/".$_GET["img"]))[0]=="image") { header('Content-type: image/'.explode("/", finfo_file($finfo, "img/".$_GET["img"]))[1]); finfo_close($finfo); include ("img/".$_GET["img"]); } }
aber es funktioniert immer noch nicht …
Ersetze das include(" img... mit readfile. Include ist wie gesagt dafür da PHP Dateien einzubinden und auszuführen, nicht um Dateiinhalte auszugebem. -
Erstens warum?
header('Content-type: image/'.explode("/", finfo_file($finfo, "img/".$_GET["img"]))[1]);
So ist es weniger Fehleranfällig:
header('Content-type: '. finfo_file($finfo, "img/".$_GET["img"]));
Und so wie du es geschrieben hast geht es eh nicht.
So wird ein Schuh draus.
if(($_GET["img"]!=null)&&($_GET["img"]!="")) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $mime=explode("/", finfo_file($finfo, "img/".$_GET["img"])); if($mime[0]=="image") { header('Content-type: image/'.$mime[1]); finfo_close($finfo); include ("img/".$_GET["img"]); } }
Fehlermeldung?
Vielelicht mal ein Link zur Seite?
Und zum zweiten sollte der include auch nur dann kommen, wenn es eine Bilddatei ist. Ansonsten kann man auch PHP-Dateien, HTML-Dateien und weiteres dort includieren. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage