Вывод изображения на PHP
у меня есть картинка $file
( например,../image.jpg
)
, который имеет тип MIME $type
как я могу вывести его в браузер?
9 ответов:
$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 M Y H: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; } }
попробуйте это:
<?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", я получаю аромат, и работает!! это скриншот: скриншот "secure image" из базы данных