PHP 回显来自 MariaDB BLOB 的图像

问题描述 投票:0回答:2

我有一个 PHP/MariaDB 应用程序,其中一些图像存储为 BLOB。我最近将该应用程序移至云托管服务,并且查看图像的行为被破坏。 PHP 服务于图像的 GET 请求是这样的:

    require(__DIR__.'/../include/db/MyDatabase.php');
    
    try {
        $data = (new MyDatabase())->getImage(htmlspecialchars($date));
        header('Content-Type:'.$data['mime']);
        header('Content-Length:'.strlen($data['image']));
        echo $data['image'];
    }catch(Exception $e){
        header('Content-Type:application/json; charset=UTF-8');
        echo json_encode([ 'errors' => [ $e->getMessage() ]]);
    }

$data
是一个关联数组,包含图像的 mime 类型、二进制和图像的日期。当我在服务器上托管该应用程序时,效果很好。这是带有 PHP 8.1 和 MySQL PDO 驱动程序 mysqlnd 8.1.2-1ubuntu2.14 的 Ubuntu 22.04。

在云托管服务上,他们使用 PHP 8.2 和 MySQL PDO 驱动程序 3.1.21,图像无法正常工作。内容长度和类型已设置:

但图像未显示:

我不知道不同的版本是否会有所不同,但我对可能出现的问题一无所知。

编辑:仅供比较,左侧的请求会返回图像,右侧的请求则不会:

我真的不知道要寻找什么,但是两种环境中都有相同的代码

有人知道可能出了什么问题,或者去哪里查看吗?

php mariadb blob
2个回答
0
投票

使用 litespeed 进行测试,有效:

<?php
header('Content-Type: image/png');
//header('Content-Length: '.filesize("test.png"));
$data = readfile("test.png");
echo $data;
exit;

看来你不需要发送

Content-Length

我注意到一种奇怪的行为......

执行

curl http://localhost/test/image.php --output test2.png
时,我的输出图像比输入图像大5个字节。

检查发现原始图像的长度(

21215
)已添加到 test2.png 文件中。

root@ubuntu45:/usr/local/lsws/Example/html/test# hexdump -C test2.png | tail -3
000052d0  71 9d ec 00 00 00 00 49  45 4e 44 ae 42 60 82 32  |q......IEND.B`.2|
000052e0  31 32 31 35                                       |1215|
000052e4
root@ubuntu45:/usr/local/lsws/Example/html/test# hexdump -C test.png | tail -3
000052c0  04 1a 81 16 00 00 00 01  26 fd ff 10 06 28 5b a5  |........&....([.|
000052d0  71 9d ec 00 00 00 00 49  45 4e 44 ae 42 60 82     |q......IEND.B`.|
000052df

测试使用:

LiteSpeed/1.7.18 Open (BUILD built: Tue Aug 29 12:59:39 UTC 2023)
在Ubuntu 22.04.3


0
投票

我认为你最好的选择是更改 litespeed 的 Max Dynamic Response Body Size 选项:

指定动态生成的响应的最大正文大小。

我认为这适用,因为您调用的是

.php
脚本而不是文件 wi

© www.soinside.com 2019 - 2024. All rights reserved.