Вернуть страницу PHP как изображение - PullRequest
58 голосов
/ 23 мая 2009

Я пытаюсь прочитать файл изображения (если быть точным .jpeg) и вернуть его обратно на страницу, но у меня есть изображение ...

В моем index.php есть ссылка на изображение:

<img src='test.php?image=1234.jpeg' />

и мой PHP-скрипт делает это в основном так:

1) читать 1234.jpeg 2) Эхо-содержимое файла ... 3) У меня такое чувство, что мне нужно вернуть результат обратно в виде пантомимы, но здесь я теряюсь

Как только я это выясню, я удаляю все введенные имена файлов и заменяю их на идентификатор изображения.

Если мне неясно или вам нужна дополнительная информация, пожалуйста, ответьте.

Ответы [ 5 ]

102 голосов
/ 23 мая 2009

В руководстве по 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) или аналогичный.

20 голосов
/ 08 ноября 2014

readfile() также обычно используется для выполнения этой задачи и, кажется, является лучшим решением, чем использование fpassthru().

Это хорошо работает для меня, и, согласно документам , это не вызовет проблем с памятью.

Вот мой пример в действии:

$file_out = "myDirectory/myImage.gif"; // The image to return

if (file_exists($file_out)) {

    //Set the content-type header as appropriate
    $image_info = getimagesize($file_out);
    switch ($image_info[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:
            header($_SERVER["SERVER_PROTOCOL"] . " 500 Internal Server Error");
            break;
    }

    // Set the content-length header
    header('Content-Length: ' . filesize($file_out));

    // Write the image bytes to the client
    readfile($file_out);

}
else { // Image file not found

    header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");

}
4 голосов
/ 30 сентября 2013

Это должно работать. Это может быть медленнее.

$img = imagecreatefromjpeg($filename);
header("Content-Type: image/jpg");
imagejpeg($img);
imagedestroy($img);
2 голосов
/ 02 марта 2018

Я работал без Content-Length. Может быть, причина работы для удаленных файлов изображений

// open the file in a binary mode
$name = 'https://www.example.com/image_file.jpg';
$fp = fopen($name, 'rb');

// send the right headers
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: January 01, 2013'); // Date in the past
header('Pragma: no-cache');
header("Content-Type: image/jpg");
/* header("Content-Length: " . filesize($name)); */

// dump the picture and stop the script
fpassthru($fp);
exit;
0 голосов
/ 23 мая 2009

Другой простой вариант (не лучше, просто другой), если вы не читаете из базы данных, это просто использовать функцию для вывода всего кода для вас ... Примечание. Если вы также хотите, чтобы 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>
...