有关imagepng的麻烦

时间:2010-08-19 09:37:46

标签: php header png gd

我正在努力使用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将图像推送到浏览器。如果我保存文件作为一个静态文件,它也会加载那么好。 它似乎不想处理动态文件。

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

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

想出来:

问题#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()