it-swarm.com.de

Bild ausgeben PHP

Ich habe ein Bild $file (zB ../image.jpg)

welches einen Mime-Typ hat $type

Wie kann ich es an den Browser ausgeben?

62
steven
$file = '../image.jpg';
$type = 'image/jpeg';
header('Content-Type:'.$type);
header('Content-Length: ' . filesize($file));
readfile($file);
120
Emre Yazici

Wenn Sie die Freiheit haben, Ihren Webserver selbst zu konfigurieren, sind Tools wie mod_xsendfile (für Apache) wesentlich besser als das Lesen und Drucken der Datei in PHP. Ihr PHP Code würde folgendermaßen aussehen:

header("Content-type: $type");
header("X-Sendfile: $file"); # make sure $file is the full path, not relative
exit();

mod_xsendfile nimmt den X-Sendfile-Header auf und sendet die Datei an den Browser selbst. Dies kann einen wirklichen Unterschied in der Leistung bewirken, insbesondere bei großen Dateien. Die meisten der vorgeschlagenen Lösungen lesen die gesamte Datei in den Speicher und drucken sie dann aus. Für eine 20-KB-Image-Datei ist das in Ordnung, aber wenn Sie eine 200-MByte-TIFF-Datei haben, werden Sie Probleme bekommen.

29
$file = '../image.jpg';

if (file_exists($file))
{
    $size = getimagesize($file);

    $fp = fopen($file, 'rb');

    if ($size and $fp)
    {
        // Optional never cache
    //  header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
    //  header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
    //  header('Pragma: no-cache');

        // Optional cache if not changed
    //  header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($file)).' GMT');

        // Optional send not modified
    //  if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) and 
    //      filemtime($file) == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']))
    //  {
    //      header('HTTP/1.1 304 Not Modified');
    //  }

        header('Content-Type: '.$size['mime']);
        header('Content-Length: '.filesize($file));

        fpassthru($fp);

        exit;
    }
}

http://php.net/manual/de/function.fpassthru.php

22
Mike
header('Content-type: image/jpeg');
readfile($image);
3
code_burgar

Versuche dies:

<?php
  header("Content-type: image/jpeg");
  readfile("/path/to/image.jpg");
  exit(0);
?>
3
Carlos Lima

(Erweiterung der akzeptierten Antwort ...)  

Ich musste: 

  1. log-Ansichten eines jpg Bildes und einer animierten gif, und, 
  2. stellen Sie sicher, dass die Bilder nie zwischengespeichert sind (damit jede Ansicht protokolliert wird), und, 
  3. auch keep die ursprünglichen Dateierweiterungen

Ich habe dies erreicht, indem ich eine "sekundäre" .htaccess-Datei in dem Unterordner erstellt habe, in dem sich die Bilder befinden.
.__ Die Datei enthält nur eine Zeile: 

AddHandler application/x-httpd-lsphp .jpg .jpeg .gif

Im selben Ordner habe ich die beiden 'Original'-Bilddateien (wir nennen sie orig.jpg und orig.gif) sowie zwei Varianten des [vereinfachten] Skripts (gespeichert als myimage.jpg und myimage.gif) ...

<?php 
  error_reporting(0); //hide errors (displaying one would break the image)

  //get user IP and the pseudo-image's URL
  if(isset($_SERVER['REMOTE_ADDR'])) {$ip =$_SERVER['REMOTE_ADDR'];}else{$ip= '(unknown)';}
  if(isset($_SERVER['REQUEST_URI'])) {$url=$_SERVER['REQUEST_URI'];}else{$url='(unknown)';}

  //log the visit
  require_once('connect.php');            //file with db connection info
  $conn = new mysqli($servername, $username, $password, $dbname);
  if (!$conn->connect_error) {         //if connected then save mySQL record
   $conn->query("INSERT INTO imageclicks (image, ip) VALUES ('$url', '$ip');");
     $conn->close();  //(datetime is auto-added to table with default of 'now')
  } 

  //display the image
  $imgfile='orig.jpg';                             // or 'orig.gif'
  header('Content-Type: image/jpeg');              // or 'image/gif'
  header('Content-Length: '.filesize($imgfile));
  header('Cache-Control: no-cache');
  readfile($imgfile);
?>

Die Bilder werden normal gerendert (oder animiert) und können auf eine beliebige normale Weise für Bilder aufgerufen werden (wie ein <img>-Tag). Sie speichern einen Datensatz der IP des Besuchers, während sie für den Benutzer nicht sichtbar sind.

0
ashleedawg

Sie können finfo (PHP 5.3+) verwenden, um den richtigen MIME-Typ zu erhalten.

$filePath = 'YOUR_FILE.XYZ';
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$contentType = finfo_file($finfo, $filePath);
finfo_close($finfo);

header('Content-Type: ' . $contentType);
readfile($filePath);

PS: Sie müssen nicht Content-Length angeben, Apache erledigt das für Sie.

0
Fabien Sa

Für den nächsten Mann oder das nächste Mädchen, das dieses Problem trifft, haben sich folgende Dinge für mich bewährt:

ob_start();
header('Content-Type: '.$mimetype);
ob_end_clean();
$fp = fopen($fullyQualifiedFilepath, 'rb');
fpassthru($fp);
exit;

Sie brauchen das alles und nur das. Wenn Ihr Mimetyp variiert, schauen Sie sich den mime_content_type von PHP ($ filepath) an.

0
Hans
<?php $data=file_get_contents(".../image.jpg" );header("Content-type: image/png"); echo $data; ?>

Der erste Schritt ist das Abrufen des Bildes von einem bestimmten Ort und das Speichern in einer Variablen für diesen Zweck. Wir verwenden die Funktion file_get_contents () mit dem Ziel als Parameter. Als nächstes setzen wir den Inhaltstyp der Ausgabeseite als Bildtyp mit Hilfe der Header-Datei. Schließlich drucken wir die abgerufene Datei mit Echo.

0
Vishnu Pradeep
<?php

header("Content-Type: $type");
readfile($file);

Das ist die kurze Version. Es gibt ein paar Kleinigkeiten, die Sie tun können, um die Dinge schöner zu machen, aber das wird für Sie funktionieren.

0

Sie können header verwenden, um den richtigen Inhaltstyp zu senden:

header('Content-Type: ' . $type);

Und readfile , um den Inhalt des Bildes auszugeben:

readfile($file);


Und vielleicht (wahrscheinlich nicht notwendig, aber nur für den Fall) müssen Sie auch den Content-Length-Header senden:

header('Content-Length: ' . filesize($file));


Hinweis: Stellen Sie sicher, dass Sie nichts anderes als Ihre Bilddaten ausgeben (z. B. keine Leerzeichen), da es sonst kein gültiges Bild ist.

0
Pascal MARTIN
    $file = '../image.jpg';
    $type = 'image/jpeg';
    header('Content-Type:'.$type);
    header('Content-Length: ' . filesize($file));
    $img = file_get_contents($file);
    echo $img;

Das funktioniert für mich! Ich habe es auf Code-Zünder getestet. Wenn ich readfile verwende, wird das Bild nicht angezeigt. Manchmal nur JPG anzeigen, manchmal nur große Datei. Aber nachdem ich es in "file_get_contents" geändert habe, bekomme ich den Geschmack und funktioniert !! Dies ist der Screenshoot: Screenshot von "Secure Image" aus der Datenbank

0