Programing

PHP 페이지를 이미지로 반환

crosscheck 2020. 12. 4. 07:54
반응형

PHP 페이지를 이미지로 반환


이미지 파일 (정확히 .jpeg)을 읽고 페이지 출력으로 다시 '반향'하려고하는데 이미지가 표시됩니다.

내 index.php에는 다음과 같은 이미지 링크가 있습니다.

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

내 PHP 스크립트는 기본적으로 다음을 수행합니다.

1) 1234.jpeg 읽기 2) 에코 파일 내용 ... 3) 출력을 MIME 형식으로 되돌려 야 할 것 같은 느낌이 들지만, 여기서 길을 잃었습니다.

이것을 알아 내면 파일 이름 입력을 모두 제거하고 이미지 ID로 바꿉니다.

확실하지 않거나 더 많은 정보가 필요하면 회신 해주십시오.


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) 등으로 저장해야합니다.


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

}

작동합니다. 느릴 수 있습니다.

$img = imagecreatefromjpeg($filename);
header("Content-Type: image/jpg");
imagejpeg($img);
imagedestroy($img);

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;

Another easy Option (not any better, just different) if you aren't reading from a database is to just use a function to output all the code for you... Note: If you also wanted php to read the image dimensions and give that to the client for faster rendering, you could easily do that too with this method.

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

참고URL : https://stackoverflow.com/questions/900207/return-a-php-page-as-an-image

반응형