【问题标题】:Trouble with imagepngimagepng 有问题
【发布时间】:2010-08-20 03:22:00
【问题描述】:

我正在努力使用 PHP 的 GD 库。

我编写了一个名为 foo.php 的脚本,它输出一个 png:

header('Content-type:image/png');
$img = imagecreatefrompng($url) or die('bad url:'.$url);
imagepng($img);
imagedestroy($img);

它工作正常。它的目的是接受一个 GET 参数,然后吐出相应的图表:

(例如)foo.php?id=2 在任何浏览器中放置一个漂亮的图表。

这是我的问题:

在另一个脚本 (baz.php) 中,我想使用readfile 或类似的东西来获取由 foo.php 创建的图像并将 baz.php 发送到浏览器。 但是无论我怎么尝试,当我调用 baz.php 时它似乎都不起作用

来自 baz.php 的示例:

switch($id) {
    case '1':
         readfile('foo.php?id=1');
         break;
    case '2':
         readfile('foo.php?id=2');
         break;
    // and so on...
}

我收到一条错误消息:

failed to open stream: No such file or directory...

如果我输入完整的网址或路径:

readfile('http://localhost/dev/foo.php?id=1');
readfile('C:/xampp/htdocs/dev/foo.php?id=1');

...我得到同样的错误。

如果我将标题添加到 baz.php:

header('Content-type:image/png');
readfile($url);

在 Firefox 中,我得到“无法显示图像“http://localhost/dev/baz.php”,因为它包含错误。在 Chrome 中,它显示大小为 27.82kb 且尺寸为 0x0 的损坏图像

allow_url_fopen 已打开,正如我所提到的,foo.php 正在生成 png 没有任何问题;我似乎无法退出 baz.php,我需要这样做。

我可以,例如:

header("Location: foo.php?id=1");

它会重定向并输出图像,但我不想做302重定向,我需要baz.php将图像推送到浏览器。如果我保存文件作为静态文件,它也会加载得很好。 它似乎不想处理动态文件。

非常感谢任何帮助。提前致谢。

【问题讨论】:

  • 这应该可以工作 readfile('http://localhost/dev/foo.php?id=1'); 是 localhost 从服务器的角度来看是正确的主机名吗?
  • @Pekka - 我知道应该。但事实并非如此。重申一下,如果我执行 readfile('localhost/dev/foo.php?id=1') 我会收到打开失败错误。如果我将localhost/dev/foo.php?id=1 粘贴到浏览器中,它会正常打开。如果我将图像保存为 temp_foo.png 并执行 readfile('temp_foo.png') that 也可以正常打开。 localhost 是正确的主机。 (仅供参考,正在删除“http”,但它就在那里)。

标签: php header png gd


【解决方案1】:

想通了:

问题 #1:

你不能使用php的readfile()来包含一个由php动态生成的png如果它在同一个服务器上。

为什么? 因为 readfile 将包含原始 php 代码,而不是将 php 代码渲染成图像。如果你想从另一台服务器调用它,readfile 可以正常工作。

因此,您可以改为包含/要求该文件(以便将其呈现为 png),但是...

问题 #2:

您不能直接包含带有参数/查询字符串的文件(例如,以下代码将出错,它无法打开文件:

include('baz.php?id=1'); //this won't work

解决方案:

  • 在 GET 字符串中手动设置参数(例如$_GET['id'] = 1;)
  • 包含文件:include('baz.php');

另请注意:Apache 的 virtual() 命令也不适用于 GET,因为只有 QUERY_STRING 被传递($_GET 是从父脚本复制而来):

PHP.net's description of virtual()

【讨论】:

  • 您很高兴发布解决方案(我希望每个人都这样做!),但您的结论不正确,抱歉 :) readfile will include the raw php code rather than rendering that php code into an image 它肯定从 任何位置,包括同一服务器,如果您指定http:// 路径。如果是这样,则说明您的配置存在严重问题!请注意,localhost 始终指向同一台机器(它是 127.0.0.1 的同义词,不是有效的主机名)。
  • @Pekka:应该,但是你试过了吗?即使有一个包装器,它也不能在我的同一台服务器上工作:(Apache/2.2.11 (Win32 ) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9) 下面是一些测试代码: chart.apis.google.com/…'; $url = 'localhost/dev/baz.php';读取文件($url); ?>chart.apis.google.com/…'; $img = imagecreatefrompng($url); imagepng($img);图像销毁($img); ?>
  • Ack - 所以又在评论中削弱了我的代码。底线是,我用包装器尝试过它,但它在同一台服务器上不起作用。我在谷歌上发现了零散的提及(例如bluehostforum.com/…)
  • 真的,真的很奇怪 - 以前从未遇到过这种情况。我现在不能尝试这个 - 如果我在接下来的几天内解决这个问题,我会提供反馈。
【解决方案2】:

【讨论】:

  • 调试好一点,但仍然是同样的问题 - 如果文件是动态的,它将无法打开文件(LoadPNG 将给出“错误加载”和文件名 'localhost/dev/foo.php ?id=1',如果我将它粘贴到浏览器中(有或没有 http)加载正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2018-06-18
  • 2023-03-31
相关资源
最近更新 更多