将PHP页面作为图像返回

时间:2009-05-22 22:10:43

标签: php image-processing http-headers mime-types

我正在尝试读取图像文件(确切地说是.jpeg),并将其“回显”回页面输出,但是显示图像...

我的index.php有一个像这样的图像链接:

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

我的php脚本基本上就是这样:

1)阅读1234.jpeg 2)echo文件内容...... 3)我有一种感觉,我需要用mime类型返回输出,但这是我迷路的地方

一旦我搞清楚了,我将一起删除文件名输入并将其替换为图像ID。

如果我不清楚,或者您需要更多信息,请回复。

6 个答案:

答案 0 :(得分:101)

PHP手册有this example

<?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)或类似内容。

答案 1 :(得分:20)

readfile()通常也用于执行此任务,似乎是比使用fpassthru()更好的解决方案。

它适用于我,根据the docs,它不会出现任何内存问题。

这是我在行动中的例子:

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

}

答案 2 :(得分:4)

这应该有效。它可能会慢一点。

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

答案 3 :(得分:2)

我没有内容长度。也许是为远程图像文件工作的原因

// 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 :(得分:0)

非常非常简单。

<?php

//could be image/jpeg or image/gif or whatever
header('Content-Type: image/png')
readfile('image.png')
?>

答案 5 :(得分:-5)

如果您不是从数据库中读取,另一个简单的选项(不是更好,只是不同)就是使用一个函数为您输出所有代码... 注意:如果您还希望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>