返回一个PHP页面作为图像
image-processing
php
5
0

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

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

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

和我的PHP脚本基本上做到这一点:

1)读取1234.jpeg 2)echo文件内容... 3)我觉得我需要使用mime类型将输出返回,但这是我迷路的地方

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

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

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

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)或类似名称。

收藏
评论

我没有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;
收藏
评论

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);
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号