PHP,用Header()显示图像

问题描述 投票:0回答:6

我正在显示来自网络根目录外部的图像,如下所示:

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

内容类型:image/png 令我困惑。

其他人帮我解决了这段代码,但我注意到并非所有图像都是 PNG。 很多都是jpg或gif。
但仍然显示成功。

有谁知道为什么吗?

php header
6个回答
78
投票

最好的解决方案是读入文件,然后决定它是哪种图像并发送适当的标头

$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;
    case "svg": $ctype="image/svg+xml"; break;
    default:
}

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

(注意:JPG 文件的正确内容类型是

image/jpeg


18
投票

有更好的方法来确定图像的类型。与 exif_imagetype

如果使用此功能,您可以知道图像的真实扩展名。

使用此功能,文件名的扩展名完全无关,这很好。

function setHeaderContentType(string $filePath): void
{
    $numberToContentTypeMap = [
        '1' => 'image/gif',
        '2' => 'image/jpeg',
        '3' => 'image/png',
        '6' => 'image/bmp',
        '17' => 'image/ico'
    ];

    $contentType = $numberToContentTypeMap[exif_imagetype($filePath)] ?? null;
    
    if ($contentType === null) {
        throw new Exception('Unable to determine content type of file.');
    }

    header("Content-type: $contentType");
}

您可以通过此链接向地图添加更多类型。

希望有帮助。


4
投票

浏览器根据收到的数据做出最佳猜测。这适用于标记(网站经常出错)和其他媒体内容。接收文件的程序通常可以弄清楚它接收到的内容,而不管它被告知的 MIME 内容类型如何。

但这不是您应该依赖的东西。建议您始终使用正确的 MIME 内容。


4
投票

虽然名字很奇怪,但您可以使用

getimagesize()
函数。这还将为您提供哑剧信息:

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 attributes
    [bits] => 8
    [mime] => image/png
)

3
投票

浏览器通常可以通过嗅探图像的元信息来判断图像类型。另外,该标题中应该有一个空格:

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

1
投票

如果您知道文件名,但不知道文件扩展名,您可以使用此功能:

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;
             }
         }
    }

注意:JPG 文件的正确内容类型是

image/jpeg

© www.soinside.com 2019 - 2024. All rights reserved.