74 votes

Produire une image en PHP

J'ai un fichier image $ (par exemple. ../Image.jpg)

qui a un type mime $ type

Comment puis-je l'envoyer au navigateur?

148voto

Emre Yazıcı Points 5413
$file = '../image.jpg';
$type = 'image/jpeg';
header('Content-Type:'.$type);
header('Content-Length: ' . filesize($file));
readfile($file);

32voto

Benjamin Wohlwend Points 14976

Si vous avez la liberté de configurer votre serveur pour vous-même, des outils comme mod_xsendfile (pour Apache) sont nettement mieux que la lecture et l'impression du fichier en PHP. PHP code devrait ressembler à ceci:

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

mod_xsendfile ramasse le X-Sendfile en-tête et envoie le fichier dans le navigateur lui-même. Cela peut faire une réelle différence dans les performances, surtout pour les gros fichiers. La plupart des solutions proposées lire l'intégralité du fichier en mémoire et ensuite l'imprimer. C'est OK pour un 20kbyte fichier image, mais si vous avez un 200 Mo de fichier TIFF, vous êtes lié pour obtenir des problèmes.

28voto

Mike Points 621
 $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/en/function.fpassthru.php

4voto

code_burgar Points 6845
header('Content-type: image/jpeg');
readfile($image);

4voto

Carlos Lima Points 2579

Essaye ça:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X