У меня есть файл $file
(например ../image.jpg
)
который имеет тип mime типа $type
Как я могу вывести его в браузер?
$file = '../image.jpg'; $type = 'image/jpeg'; header('Content-Type:'.$type); header('Content-Length: ' . filesize($file)); readfile($file);
Если вы имеете право самостоятельно настраивать свой веб-сервер, такие инструменты, как mod_xsendfile (для Apache), значительно лучше, чем чтение и печать файла на PHP. Ваш PHP-код будет выглядеть так:
header("Content-type: $type"); header("X-Sendfile: $file"); # make sure $file is the full path, not relative exit();
mod_xsendfile собирает заголовок X-Sendfile и отправляет файл самому браузеру. Это может существенно повлиять на производительность, особенно для больших файлов. Большинство предлагаемых решений считывают весь файл в память и затем распечатывают его. Это нормально для 20-килобайтного файла изображения, но если у вас есть 200-мегабайтный TIFF-файл, вы обязательно получите проблемы.
$file = '../image.jpg'; if (file_exists($file)) { $size = getimagesize($file); $fp = fopen($file, 'rb'); if ($size and $fp) { // Optional never cache // header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); // header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past // header('Pragma: no-cache'); // Optional cache if not changed // header('Last-Modified: '.gmdate('D, d MYH:i:s', filemtime($file)).' GMT'); // Optional send not modified // if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) and // filemtime($file) == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) // { // header('HTTP/1.1 304 Not Modified'); // } header('Content-Type: '.$size['mime']); header('Content-Length: '.filesize($file)); fpassthru($fp); exit; } }
header('Content-type: image/jpeg'); readfile($image);
Попробуй это:
<?php header("Content-type: image/jpeg"); readfile("/path/to/image.jpg"); exit(0); ?>
<?php header("Content-Type: $type"); readfile($file);
Это короткая версия. Есть несколько дополнительных вещей, которые вы можете сделать, чтобы сделать все лучше, но это сработает для вас.
Вы можете использовать заголовок для отправки правильного типа содержимого:
header('Content-Type: ' . $type);
И readfile
для вывода содержимого изображения:
readfile($file);
И возможно (возможно, не обязательно, но на всякий случай) вам также придется отправить заголовок Content-Length:
header('Content-Length: ' . filesize($file));
Примечание. Убедитесь, что вы не выводите ничего, кроме данных изображения (например, без пробелов) или оно больше не будет действительным изображением.
Вы можете использовать finfo
(PHP 5.3+), чтобы получить правильный тип MIME.
$filePath = 'YOUR_FILE.XYZ'; $finfo = finfo_open(FILEINFO_MIME_TYPE); $contentType = finfo_file($finfo, $filePath); finfo_close($finfo); header('Content-Type: ' . $contentType); readfile($filePath);
PS : Вам не нужно указывать Content-Length
, Apache сделает это за вас.
$file = '../image.jpg'; $type = 'image/jpeg'; header('Content-Type:'.$type); header('Content-Length: ' . filesize($file)); $img = file_get_contents($file); echo $img;
Это работает для меня! Я тестировал его на воспламенителе кода. если я использую readfile, изображение не будет отображаться. Иногда отображается только jpg, иногда только большой файл. Но после того, как я изменил его на «file_get_contents», я получаю вкус и работает! это скриншот: Скриншот «безопасного изображения» из базы данных