PHP, отображение изображения с заголовком () - PullRequest
36 голосов
/ 14 апреля 2010

Я показываю изображения из-за пределов моего веб-корня, например:

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

Тип контента: image / png - вот что меня смущает.

Кто-то еще помог мне с этим кодом, но я заметил, что не все изображения в формате PNG. Многие из них JPG или GIF.
И все же они отображаются успешно.

кто-нибудь знает почему?

Ответы [ 6 ]

55 голосов
/ 14 апреля 2010

Лучшим решением было бы прочитать файл, затем решить, какое это изображение, и отправить соответствующий заголовок

$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)

14 голосов
/ 07 марта 2014

Лучше определить тип изображения.с 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)]);
}

Вы можете добавить больше типов из ссылка .

Надеюсь, это поможет.

4 голосов
/ 14 апреля 2010

Браузеры делают свои лучшие предположения с данными, которые они получают Это работает для разметки (которую веб-сайты часто ошибаются) и другого медиа-контента. Программа, которая получает файл, часто может выяснить, что он получил, независимо от типа содержимого MIME, о котором ему было сказано.

Однако на это не стоит полагаться. Рекомендуется всегда использовать правильный контент MIME.

3 голосов
/ 14 апреля 2010

Браузеры часто могут определить тип изображения, обнаружив метаинформацию изображения. Кроме того, в этом заголовке должен быть пробел:

header('Content-type: image/png');
2 голосов
/ 28 декабря 2016

Несмотря на странные названия, вы можете использовать функцию 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
)
0 голосов
/ 18 февраля 2015

если вы знаете имя файла, но не знаете расширения файла, вы можете использовать эту функцию:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...