web-dev-qa-db-fra.com

PHP, afficher l'image avec Header ()

J'affiche des images de l'extérieur de ma racine Web, comme ceci:

header('Content-type:image/png');
readfile($fullpath);

Le type de contenu: image/png est ce qui m'embrouille.

Quelqu'un d'autre m'a aidé avec ce code, mais j'ai remarqué que toutes les images ne sont pas au format PNG. Beaucoup sont en jpg ou gif.
Et ils sont toujours affichés avec succès.

quelqu'un sait-il pourquoi?

37
coffeemonitor

La meilleure solution serait de lire le fichier, puis de décider de quel type d'image il s'agit et d'envoyer l'en-tête approprié

$filename = basename($file);
$file_extension = strtolower(substr(strrchr($filename,"."),1));

switch( $file_extension ) {
    case "gif": $ctype="image/gif"; break;
    case "png": $ctype="image/png"; break;
    case "jpeg":
    case "jpg": $ctype="image/jpeg"; break;
    default:
}

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

(Remarque: le type de contenu correct pour les fichiers JPG est image/jpeg )

57
paullb

Il y a une meilleure raison de déterminer le type d'une image. avec exif_imagetype

Si vous utilisez cette fonction, vous pouvez indiquer l'extension réelle de l'image.

avec cette fonction, l'extension du nom de fichier est complètement hors de propos, ce qui est bien.

function set-header-content-type($file)
{
    //Number to Content Type
    $ntct = Array( "1" => "image/gif",
                   "2" => "image/jpeg", #Thanks to "Swiss Mister" for noting that 'jpg' mime-type is jpeg.
                   "3" => "image/png",
                   "6" => "image/bmp",
                   "17" => "image/ico");

    header('Content-type: ' . $ntct[exif_imagetype($file)]);
}

Vous pouvez ajouter plus de types de le lien .

J'espère que ça aide.

14
aliqandil

Les navigateurs font leur meilleure estimation avec les données qu'ils reçoivent. Cela fonctionne pour le balisage (que les sites Web se trompent souvent) et d'autres contenus multimédias. Un programme qui reçoit un fichier peut souvent comprendre ce qu'il reçoit, quel que soit le type de contenu MIME qui lui a été communiqué.

Ce n'est cependant pas quelque chose sur lequel vous devez compter. Il est recommandé de toujours utiliser le contenu MIME correct.

4
cletus

Les navigateurs peuvent souvent déterminer le type d'image en reniflant les métadonnées de l'image. De plus, il devrait y avoir un espace dans cet en-tête:

header('Content-type: image/png');
3
karim79

Bien que portant un nom étrange, vous pouvez utiliser la fonction getimagesize() . Cela vous donnera également des informations sur le mime:

Array
(
    [0] => 295 // width
    [1] => 295 // height
    [2] => 3 // http://php.net/manual/en/image.constants.php
    [3] => width="295" height="295" // width and height as attr's
    [bits] => 8
    [mime] => image/png
)
2
Martijn

si vous connaissez le nom du fichier, mais ne connaissez pas l'extension du fichier, vous pouvez utiliser cette fonction:

public function showImage($name)
    {

         $types = [
             'gif'=> 'image/gif',
             'png'=> 'image/png',
             'jpeg'=> 'image/jpeg',
             'jpg'=> 'image/jpeg',
         ];
         $root_path  = '/var/www/my_app'; //use your framework to get this properly ..
         foreach($types as $type=>$meta){
             if(file_exists($root_path .'/uploads/'.$name  .'.'. $type)){
                 header('Content-type: ' . $meta);
                 readfile($root_path .'/uploads/'.$name .'.'. $type);
                 return;
             }
         }
    }

Non: le type de contenu correct pour les fichiers JPG est image/jpeg .

0
d.raev