PHP, отображать изображение с заголовком()
Я показываю изображения из-за пределов моего корневого каталога, например:
header('Content-type:image/png');
readfile($fullpath);
Тип содержимого: изображение/png - вот что меня смущает.
Кто-то еще помог мне с этим кодом, но я заметил, что не все изображения являются PNG. Многие из них являются jpg или gif.
И все равно они отображаются успешно.
Кто-нибудь знает, почему?
6 answers
Лучшим решением было бы прочитать файл, затем решить, какое это изображение, и отправить соответствующий заголовок
$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
)
Есть лучший способ определить тип изображения. с типом exif_imagetype
Если вы используете эту функцию, вы можете определить реальное расширение изображения.
с этой функцией расширение имени файла совершенно не имеет значения, что хорошо.
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)]);
}
Вы можете добавить больше типов из ссылки.
Надеюсь, это поможет.
Браузеры делают свои лучшие предположения на основе полученных данных. Это работает для разметки (которую веб-сайты часто ошибаются) и другого медиаконтента. Программа, которая получает файл, часто может определить, что она получила, независимо от типа содержимого MIME, о котором ей было сказано.
Однако это не то, на что вам следует полагаться. Рекомендуется всегда использовать правильный контент MIME.
Браузеры часто могут определить тип изображения, вынюхивая метаинформацию изображения. Кроме того, в этом заголовке должен быть пробел:
header('Content-type: image/png');
Несмотря на странное название, вы можете использовать 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
)
Если вы знаете имя файла, но не знаете расширение файла, вы можете использовать эту функцию:
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
.