Вернуть страницу PHP как изображение
Я пытаюсь читать файл изображения (точнее,.jpeg) и "эхо" его обратно на вывод страницы, но есть отображение изображения...
my index.php имеет ссылку на изображение следующим образом:
<img src='test.php?image=1234.jpeg' />
и мой php script делает в основном это:
1) читать 1234.jpeg
2) содержимое эхо файла...
3) У меня есть ощущение, что мне нужно вернуть результат обратно с типом mime, но это то, где я теряюсь
Как только я это выясню, я удалю имя имени файла вместе и заменим его идентификатором изображения.
Если я неясен, или вам нужна дополнительная информация, ответьте.
Ответы
Ответ 1
В руководстве PHP есть этот пример:
<?php
// open the file in a binary mode
$name = './img/ok.png';
$fp = fopen($name, 'rb');
// send the right headers
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));
// dump the picture and stop the script
fpassthru($fp);
exit;
?>
Важным моментом является то, что вы должны отправить заголовок Content-Type. Кроме того, вы должны быть осторожны, чтобы не добавлять лишние пробелы (например, новые строки) в ваш файл до или после тегов <?php ... ?>
.
Как указано в комментариях, вы можете избежать опасности лишнего пробела в конце вашего script, опуская тег ?>
:
<?php
$name = './img/ok.png';
$fp = fopen($name, 'rb');
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));
fpassthru($fp);
Вам все равно нужно избегать пробелов в верхней части script. Одна особенно сложная форма белого пространства - это спецификация UTF-8. Чтобы этого избежать, обязательно сохраните script как "ANSI" ( "Блокнот" ) или "ASCII" или "UTF-8 без подписи" (Emacs) или аналогичные.
Ответ 2
readfile()
обычно используется для выполнения этой задачи. Я не могу сказать, если это лучшее решение, чем использование fpassthru()
, но оно работает хорошо для меня и, согласно docs, оно будет не возникают проблемы с памятью.
Вот мой пример этого в действии:
if (file_exists("myDirectory/myImage.gif")) {//this can also be a png or jpg
//Set the content-type header as appropriate
$imageInfo = getimagesize($fileOut);
switch ($imageInfo[2]) {
case IMAGETYPE_JPEG:
header("Content-Type: image/jpeg");
break;
case IMAGETYPE_GIF:
header("Content-Type: image/gif");
break;
case IMAGETYPE_PNG:
header("Content-Type: image/png");
break;
default:
break;
}
// Set the content-length header
header('Content-Length: ' . filesize($fileOut));
// Write the image bytes to the client
readfile($fileOut);
}
Ответ 3
Это должно сработать. Это может быть медленнее.
$img = imagecreatefromjpeg($filename);
header("Content-Type: image/jpg");
imagejpeg($img);
imagedestroy($img);
Ответ 4
Еще один простой вариант (не лучше, просто отличный), если вы не читаете из базы данных, - это просто использовать функцию для вывода всего кода для вас...
Примечание. Если вы также хотели, чтобы php считывал размеры изображения и предоставлял его клиенту для более быстрого рендеринга, вы также можете легко сделать это с помощью этого метода.
<?php
Function insertImage( $fileName ) {
echo '<img src="path/to/your/images/',$fileName,'">';
}
?>
<html>
<body>
This is my awesome website.<br>
<?php insertImage( '1234.jpg' ); ?><br>
Like my nice picture above?
</body>
</html>