В руководстве по 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 ... ?>
.
Как предлагается в комментариях, вы можете избежать опасности появления лишних пробелов в конце вашего скрипта, пропустив тег ?>
:
<?php
$name = './img/ok.png';
$fp = fopen($name, 'rb');
header("Content-Type: image/png");
header("Content-Length: " . filesize($name));
fpassthru($fp);
Вам все еще нужно тщательно избегать пробелов в верхней части сценария. Одна особенно хитрая форма пробела - UTF-8 BOM . Чтобы избежать этого, сохраните ваш скрипт как «ANSI» (Блокнот) или «ASCII» или «UTF-8 без подписи» (Emacs) или аналогичный.