Zwróć stronę PHP jako obraz

Próbuję odczytać plik obrazu (.jpeg, aby być dokładnym), i "echo" go z powrotem do wyjścia strony, ale mieć jest wyświetlanie obrazu...

Mój indeks.php ma taki link do obrazka:
<img src='test.php?image=1234.jpeg' />

A mój skrypt php robi w zasadzie to:

[[1]}1) czytano 1234.jpeg 2) echo zawartości pliku... 3) mam wrażenie, że muszę zwrócić wyjście z powrotem za pomocą typu mime, ale tutaj się gubię

Kiedy to rozgryzę, będę usuwał nazwę pliku wprowadzając wszystkie razem i zastąp go identyfikatorem obrazu.

Jeśli jestem niejasny, lub potrzebujesz więcej informacji, proszę o odpowiedź.

Author: Martin Geisler, 2009-05-22

5 answers

Podręcznik PHP ma Ten przykład:

<?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;
?>

Ważne jest to, że musisz wysłać nagłówek typu Content. Należy również uważać, aby nie umieszczać dodatkowych białych spacji (takich jak znaki nowej linii) w pliku przed lub po znacznikach <?php ... ?>.

Zgodnie z sugestią w komentarzach, możesz uniknąć niebezpieczeństwa dodatkowej białej spacji na końcu skryptu, pomijając tag ?>:

<?php
$name = './img/ok.png';
$fp = fopen($name, 'rb');

header("Content-Type: image/png");
header("Content-Length: " . filesize($name));

fpassthru($fp);

Nadal musisz ostrożnie unikać białych spacji na górze skryptu. Jeden szczególnie skomplikowaną formą białej przestrzeni jest UTF-8 BOM . Aby tego uniknąć, pamiętaj, aby zapisać swój skrypt jako "ANSI" (Notatnik) lub "ASCII" lub "UTF-8 without signature" (Emacs) lub podobne.

 120
Author: Martin Geisler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-13 12:56:35

Wydaje mi się, że możemy ułatwić ten kod, pobierając typ mime z $image_info:

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

if (file_exists($file_out)) {

   $image_info = getimagesize($file_out);

   //Set the content-type header as appropriate
   header('Content-Type: ' . $image_info['mime']);

   //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");

}

Dzięki temu rozwiązaniu można przetwarzać każdy rodzaj obrazu, ale jest to tylko inna opcja. Dzięki ban-Geoinżynieria za Twój wkład.

 29
Author: ban-geoengineering,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-26 19:44:25

To powinno zadziałać. Może być wolniej.

$img = imagecreatefromjpeg($filename);
header("Content-Type: image/jpg");
imagejpeg($img);
imagedestroy($img);
 4
Author: Drew LeSueur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-30 15:41:40

Pracowałem bez Content-Length . być może powód pracy dla zdalnych plików obrazów

// 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;
 4
Author: Berk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-02 18:31:43

Kolejną łatwą opcją (Nie lepszą, po prostu inną), jeśli nie czytasz z bazy danych, jest użycie funkcji do wypisania całego kodu za Ciebie... Uwaga: jeśli chcesz również, aby php odczytało wymiary obrazu i przekazało je klientowi w celu szybszego renderowania, możesz to zrobić również za pomocą tej metody.

<?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>
 -5
Author: Joe Bubna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-22 23:20:09