如何解决GD库中的问题?

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

我在GD php库中遇到问题,当我将图像发送到本地主机VM时,该图像通常在屏幕上生成,当我尝试在VPS上执行此操作时,我不生成图像,并且屏幕为白色,已检查lib GD在两台计算机上是否相同,并且一切正常。

按照我在屏幕上生成图像的代码...

$image = imagecreatefrompng((isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]" . "/wp-content/uploads/cart1.png");

$imageCart = imagecreatefrompng($perfil);

$titleColor = imagecolorallocate($image, 255, 255, 255);
$gray = imagecolorallocate($image, 100, 100, 100);
$black = imagecolorallocate($image, 0, 0, 0);

imagecopymerge($image, $imageCart, 60, 177, 0, 0, imagesx($imageCart), imagesy($imageCart), 100);

imagestring($image, 5, 170, 175, "NOME  " . strtoupper($nomeCompleto), $titleColor);
imagestring($image, 5, 170, 205, "CPF  " . $cpf, $titleColor);
imagestring($image, 5, 170, 235, "MATRICULA  " . $matricula, $titleColor);
imagestring($image, 5, 170, 263, "DT NASCIMENTO " . $dtnacimento, $titleColor);

header("Content-type: image/png");

imagepng($image);
imagepng($imageCart);

imagedestroy($image);
imagedestroy($imageCart);
php gd
1个回答
0
投票

这个问题很有趣,因为注释中报告的本地和远程服务器环境相同。常见的问题是gd扩展程序安装在一个扩展程序中,而另一扩展程序却丢失了,但这不是这种情况。他们甚至被报告为具有相同的内部版本号。

所以第一个问题在这里:

imagepng($image);
imagepng($imageCart);

imagepng()函数获取图像的二进制数据,并将其发送到/dev/stdout,在那里它将被Web服务器捕获,并传输到发出请求的客户端。由于浏览器将看到两个串联的PNG图像,因此拥有其中两个可能会带来奇怪的结果。如评论中所述,这可能适用于某些浏览器,可能不适用于其他浏览器-换句话说,我们不能依靠它来工作。最好只发送有效的输出,即使在某些情况下我们可以使其正常工作。因此,第一件事就是只发送一张图片。

下一个问题在此行中,通过调试找到:

$image = imagecreatefrompng((isset($_SERVER['HTTPS']) ? "https" : "http") .
    "://$_SERVER[HTTP_HOST]" .
    "/wp-content/uploads/cart1.png");

基本上,这是通过HTTP / HTTPS加载源PNG图片。这利用了PHP中的一项功能,该功能允许使用URL代替文件路径。从the manual

如果启用了fopen wrappers,则URL可以用作带有此功能的文件名。有关如何指定文件名的更多详细信息,请参见fopen()。请参阅Supported Protocols and Wrappers,以获取有关各种包装程序具有哪些功能,其使用说明以及它们可能提供的任何预定义变量的信息的链接。

那么我会冒昧地猜测您的allow_url_fopen在本地计算机上为true,在VPS上为false或未设置。可以通过远程更改它来使其工作,但是所做的修复可能更好-就是直接从文件系统中加载它。

如果使用fopen包装器,则实际上是向Web服务器发出请求,该请求从磁盘中获取图像,然后通过curl返回它。因此,通过直接使用其文件名获取图像,您可以“裁剪中间人”并使其更高效。

在这种情况下,通常使用目录遍历运算符来创建相对于脚本目录的路径名。使用的一个完美的解决方案是:

imagecreatefrompng ("../../../wp-content/uploads/cart1.png")

您还可以使用魔术变量(假设脚本距离项目根目录低三级):

$projectDir = realpath(__DIRECTORY__ . "/../../..");
imagecreatefrompng ($projectDir . "/wp-content/uploads/cart1.png")

[您可能会发现WordPress设置了一些自己的项目目录常量,因此在这种情况下也可以使用它们。

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