【问题标题】:getimagesize on dynamic image动态图像上的getimagesize
【发布时间】:2012-10-22 12:27:03
【问题描述】:

我有一个 MySQL 表,我在其中将用户头像存储为 blob。我使用名为 avatar.php 的脚本获取这些图像,该脚本输出图像。要请求特定的用户图像,您必须调用 avatar.php?id=(user 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。这些函数不适合动态文件吗?

有人可以帮帮我吗?

提前致谢

【问题讨论】:

    标签: php .htaccess dynamic getimagesize


    【解决方案1】:
    1. 将图像字符串直接从数据库加载到变量中...而不是通过 getimagesize('avatar.php?id=1');
    2. 使用imagecreatefromstring 将图像加载为图像对象。之后,您可以操作您的图像并将其发送到您的输出。

    如果您只想要图像大小而不进行任何操作,您可以使用getimagesizefromstring

    【讨论】:

      【解决方案2】:

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

      如果您的图像存储在数据库中,则在将图像放入数据库并将它们存储在数据库列中时一次计算图像尺寸。然后简单地从数据库中查询大小。


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

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

      【讨论】:

      • 我以 getimagesize 为例。实际上我暂时在数据库中存储了一个大图像,我想通过 imagecreatefromjpeg 加载它以制作它的缩略图并将其存储在数据库的另一列中。换句话说,我必须从数据库中获取图像,使用 GD 对其进行操作,然后再次将其存储回数据库中。
      • 是的,我希望我已经消除了您对文件路径/URL 的困惑。 imagecreatefromjpeg 也需要一个文件路径。如果您从数据库中获取图像,则不会将它作为文件保存在磁盘上,并且它也不会工作。那么你需要使用imagecreatefromstring。
      【解决方案3】:

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

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

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

      您还可以使用imagecreatefromstring (link) 创建一个图像资源,将您从数据库中获得的结果提供给该函数,然后对其进行操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 2012-09-27
        相关资源
        最近更新 更多