Я показываю изображения вне моего веб-корня, например:
header('Content-type:image/png'); readfile($fullpath);
Тип контента: image / 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
)
Лучше всего определить тип изображения. с 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
.