PHP从MariaDB BLOB回显图像

p4tfgftt  于 6个月前  发布在  PHP
关注(0)|答案(4)|浏览(63)

我有一个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类型、二进制和图像的日期。当我在我的服务器上托管应用程序时,这很好用。这是Ubuntu 22.04,PHP 8.1和MySQL PDO驱动程序mysqlnd 8.1.2 - 1ubuntu2.14。
在云托管服务上,他们使用的是PHP 8.2和MySQL PDO驱动程序3.1.21,图像不工作。内容长度和类型设置:
x1c 0d1x的数据
但图像未显示:



我不知道事情的不同版本是否有区别,但我对可能出错的地方一无所知。
编辑:只是为了比较,左边的请求会导致图像返回,右边的请求不会:



我真的不知道要找什么,但是两个环境中都有相同的代码
有人知道哪里出了问题吗,或者去哪里找?

3j86kqsm

3j86kqsm1#

让相同的代码在两个不同的环境中产生两个不同的结果通常意味着存在版本差异,或者更有可能(在您的情况下,我认为)是配置不匹配。
我认为您最好的选择是查看/更改litespeed的最大动态响应车身尺寸选项:
指定动态生成的响应的最大正文大小。
我认为这是适用的,因为您调用的是.php脚本,而不是一个具有常见扩展名的文件,该文件已知会生成静态数据(例如.png)。
您的代码看起来有些正确,尽管htmlspecialchar对于向数据库发出请求有点奇怪。通常您只使用htmlspecialchar将不受信任的数据输出到浏览器客户端。

hivapdat

hivapdat2#

由于您的算法是确定性的,并且它在不同的服务器设置上的操作方式不同,因此问题可能是:

  • OS版本差异
  • OS设置差异
  • DB版本差异
  • DB设置差异
  • PHP版本差异
  • 数据差异

这些问题的解决方案是与操作系统,数据库,PHP和Web服务器的操作方式保持一致,这将最大限度地减少出现此类问题的机会。
但是,如果你想找出到底是什么导致了你的问题,那么你可以设置一个docker环境,一个虚拟机或一个实际的机器来拥有W(其中W是操作系统,PHP,DB和数据方面的工作设置),看看你是否可以在此设置副本上复制成功.如果没有,然后修复阻止它工作的问题,它应该不难,因为你的出发点是工作设置。
现在,当你设法使你的W设置可移植时,在你的实验设置中逐渐从W设置漂移到F(失败)设置,一次一步(例如,首先改变PHP的版本),看看哪个设置/配置/数据步骤将你的设置从工作转换为不工作。这就是你的bug所在的地方(或者更准确地说,有一个bug,希望是唯一的bug)。

yhived7q

yhived7q3#

使用litespeed测试,它可以工作:

<?php
header('Content-Type: image/png');
//header('Content-Length: '.filesize("test.png"));
$data = readfile("test.png");
// echo $data;  // EDIT: This is wrong because it outputs the size of the picture, and that was not supposed to happen..
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


编辑:我在PHP中注解了其中一行(并添加了注解),因为它正在输出图像的长度。
测试使用:LiteSpeed/1.7.18 Open (BUILD built: Tue Aug 29 12:59:39 UTC 2023)在Ubuntu 22.04.3

xzv2uavs

xzv2uavs4#

简单地使用base64_encode

header('Content-Type: image/jpeg');
echo base64_encode($data['image']);

字符串

相关问题