У меня есть изображение $file
(например, ../image.jpg
)
который имеет тип mime $type
Как я могу вывести его в браузер?
У меня есть изображение $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 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;
}
}
header('Content-type: image/jpeg');
readfile($image);
Попробуйте следующее:
<?php
header("Content-type: image/jpeg");
readfile("/path/to/image.jpg");
exit(0);
?>
Для следующего парня или девушки, которая столкнулась с этой проблемой, вот что сработало для меня:
ob_start();
header('Content-Type: '.$mimetype);
ob_end_clean();
$fp = fopen($fullyQualifiedFilepath, 'rb');
fpassthru($fp);
exit;
Вам нужно все это, и только это. Если ваш mimetype варьируется, взгляните на PHP mime_content_type ($ filepath)
<?php
header("Content-Type: $type");
readfile($file);
Это короткая версия. Есть несколько дополнительных вещей, которые вы можете сделать, чтобы сделать все лучше, но это сработает для вас.
Вы можете использовать header для отправки правильного типа содержимого:
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", я получаю вкус и работает! это экранизация экрана: Снимок экрана "безопасное изображение" из базы данных
(Расширение на принятый ответ...)
Я нуждался в:
jpg
и анимированных gif
, и, Я сделал это, создав "вторичный" файл .htaccess
в .htaccess
в которой находятся изображения.
Файл содержит только одну строку:
AddHandler application/x-httpd-lsphp .jpg .jpeg .gif
В эту же папку я поместил два "оригинальных" файла изображений (назовем их orig.jpg
и orig.gif
), а также два варианта [упрощенного] сценария ниже (сохраненные как myimage.jpg
и myimage.gif
)...
<?php
error_reporting(0); //hide errors (displaying one would break the image)
//get user IP and the pseudo-image URL
if(isset($_SERVER['REMOTE_ADDR'])) {$ip =$_SERVER['REMOTE_ADDR'];}else{$ip= '(unknown)';}
if(isset($_SERVER['REQUEST_URI'])) {$url=$_SERVER['REQUEST_URI'];}else{$url='(unknown)';}
//log the visit
require_once('connect.php'); //file with db connection info
$conn = new mysqli($servername, $username, $password, $dbname);
if (!$conn->connect_error) { //if connected then save mySQL record
$conn->query("INSERT INTO imageclicks (image, ip) VALUES ('$url', '$ip');");
$conn->close(); //(datetime is auto-added to table with default of 'now')
}
//display the image
$imgfile='orig.jpg'; // or 'orig.gif'
header('Content-Type: image/jpeg'); // or 'image/gif'
header('Content-Length: '.filesize($imgfile));
header('Cache-Control: no-cache');
readfile($imgfile);
?>
Изображения отображаются (или анимируются) обычным образом и могут вызываться любым обычным способом для изображений (например, <img>
) и сохраняют запись IP-адреса посетителя, хотя и невидимы для пользователя.
<?php $data=file_get_contents(".../image.jpg" );header("Content-type: image/png"); echo $data; ?>
Первым шагом является получение изображения из определенного места, а затем сохранение его в переменной, для этого мы используем функцию functio file_get_contents() с пунктом назначения в качестве параметра. Далее мы устанавливаем тип содержимого выходной страницы как тип изображения, используя файл заголовка. Наконец мы печатаем полученный файл, используя echo.