动态图像上的getimagesize

时间:2012-10-22 12:27:04

标签: php .htaccess dynamic getimagesize

我有一个MySQL表,我将用户头像存储为blob。我使用名为avatar.php的脚本获取这些图像,该脚本输出图像。要请求特定的用户图像,您必须调用avatar.php?id =(用户ID)。为了使动态图像名称漂亮,我在.htaccess中添加了一个URL重写,这样你也可以调用avatar-(userid).jpg,它将转换为avatar.php?id =(userid)。

现在我想获取用户图像并使用GD进行操作。我尝试使用getimagesize()和imagecreatefromjpeg(),但我不断得到“无法打开流没有这样的文件或目录”错误。我尝试使用这些函数的脚本,作为avatar.php脚本,在根目录中。我试过了:

getimagesize('avatar.php?id=1');
getimagesize('./avatar.php?id=1');
getimagesize('/avatar.php?id=1');
...and the same but using avatar-1.jpg instead.

当我使用我网站的完整网址(包括http://等)时,它确实有用......但我还没找到原因。

// 修改: 使用file_exists()函数时会发生类似的问题。如果我尝试file_exists('。/ avatar.php')它返回true,如果我添加get-vars则返回false。这些功能是否不适合动态文件?

有人可以帮帮我吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

getimagesize需要 文件路径 getimagesize('avatar.php?id=1')尝试在本地硬盘上打开文件avatar.php?id=1,这当然不存在 如果您使用getimagesize('http://example.com/avatar.php?id=1'),则可以理解该路径是一个URL,它将通过HTTP包装器。基本上,getimagesize仍然认为它打开了一个本地文件,但PHP将在后台通过HTTP请求获取该文件。由于该HTTP请求实际上返回了有效的图像文件,因此可以使用 当然,每次尝试打开图像时,都希望使用您的Web服务器,因为这是不必要的资源浪费。事实上,即使getimagesize('avatar.php?id=1')按照你认为的方式工作,对于你想要做的事情来说仍然是很多开销。

如果您的图像存储在数据库中,当您将图像放入数据库并将其存储在数据库列中时,请确定图像尺寸一次。然后只需从数据库中查询大小。


  

使用file_exists()函数时会出现类似问题。如果我试试   如果我添加get-vars,它会返回true file_exists('./avatar.php')   返回false。这些功能是否不适合动态文件?

所有这些功能都需要 文件路径 avatar.php是有效的文件名/路径。 avatar.php?foo=bar 是有效的文件名/路径。后者是(部分)URL。 URL与本地文件系统无关。它们仅通过Web服务器处理,该服务器可能会也可能不会调用磁盘上的PHP或其他文件。您需要区分文件路径 URL 的概念。

答案 1 :(得分:2)

  1. 将图像字符串直接从数据库加载到变量中......不是通过getimagesize('avatar.php?id = 1');
  2. 使用imagecreatefromstring将图像作为图像对象加载。之后,您可以操纵图像并将其发送到输出。
  3. 如果您只想要图像尺寸而不需要任何操作,可以使用getimagesizefromstring

答案 2 :(得分:1)

它不起作用,因为getimagesize试图打开php文件,而不是php文件在解析和执行时输出的“图像”。

这也是完整URL工作的原因:您的脚本请求来自您的网络服务器的输出,并且网络服务器执行脚本(从数据库加载图像并输出它)。

通过网络服务器加载(使用完整的URL)可能仍然是最简单的选择。

您还可以使用imagecreatefromstringlink)创建图像资源,从数据库中提供结果,然后对其进行操作。