Вернуть страницу 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>