PHP,用头显示图像()
问题描述:
我我的网站根目录外显示来自图像,像这样:PHP,用头显示图像()
header('Content-type:image/png');
readfile($fullpath);
的内容类型:图像/ PNG是什么让我困惑。
其他人帮我用这段代码,但我注意到并非所有的图片都是PNG。许多是JPG或GIF。
而且它们仍然显示成功。
有谁知道为什么?
答
最好的解决办法是在文件中读取,然后决定它是一种形象并发出相应的头
$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);
(注:正确的内容类型为JPG文件是image/jpeg
)
答
浏览器通常可以通过嗅探图像的元信息来判断图像类型。此外,该标题中应该有空格:
header('Content-type: image/png');
答
浏览器会根据所收到的数据做出最佳猜测。这适用于标记(哪些网站经常出错)和其他媒体内容。接收文件的程序通常可以找出它收到的内容,而不管它被告知的MIME内容类型。
但这不是你应该依赖的东西。建议您始终使用正确的MIME内容。
答
有一个更好的为什么确定图像的类型。与exif_imagetype
如果您使用此功能,您可以告诉图像的真实扩展名。
这个函数filename的扩展名是完全不相关的,这很好。
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)]);
}
您可以从the link添加更多的类型。
希望它有帮助。
答
,如果你知道文件的名称,但不知道该文件扩展您可以使用此功能:
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
。
答
虽然奇怪的命名,您可以使用getimagesize()
函数。这也将给你的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
)
我欣赏抓住扩展的示例代码。具体确定是最佳实践。 – coffeemonitor 2010-04-14 05:38:18
不客气! – paullb 2013-08-09 09:40:42
$ ctype应该从getimagesize() – Tobia 2013-11-06 16:19:08