【问题标题】:How can I programmatically obtain an image's REAL URL/Path?如何以编程方式获取图像的真实 URL/路径?
【发布时间】:2010-10-10 11:52:21
【问题描述】:

为了澄清标题问题,我有如下代码:

<img src='gallery/main.php?g2_view=core.DownloadItem&g2_itemId=8161&g2_serialNumber=2&g2_GALLERYSID=5b24df90ee45f0e01795a3c01a1d634b'>

文件实际上驻留在我的 webroot 下的文件系统中。 PHP中是否有任何方法可以检索正在提供的图像真实路径,例如:

<img src='images/gallery/album1/file1.jpg'>

例如 someFunction(longURL) ==> images/gallery/album1/file1.jpg

谢谢,

【问题讨论】:

  • 我在自己的脚本中显示图像,但画廊脚本是管理图像本身的脚本。它们存在于文件系统中,但通过链接显示,例如我发布的链接。我正在寻找从长路径中检索真实路径。
  • 您需要路径还是图像本身?

标签: php url image


【解决方案1】:

鉴于该网址,很容易理解它使用的是g2_itemId=8161,这意味着它可能是从数据库中获取图像的路径。

考虑到这个逻辑,您可以查询数据库并以编程方式获取您想要的路径。

function someFunction($id) {
   // select path_name from g2_items where item_id = $id;
}
someFunction("8161");

【讨论】:

  • 不错的选择,尤其是考虑到画廊 SID。 (我看的不够仔细,以为 8161 可能会导致 file8161.jpg 什么的)。
  • path_name 未作为单个字符串存储在数据库中。它由一堆不同的路径块组成。这一切都是支离破碎的,真的很混乱(那里的画廊专家 - 为什么?!)。如果我知道它就在数据库中,我会直接查询它。
  • barfoon,你能把我的用户名@hotmail.com 的main.php 文件发邮件给我吗?没有一些代码很难诊断这个:-)
【解决方案2】:

我很确定,Gallery2(您显然正在使用)对此有一个内部方法 - 至少它在某个地方解决了这个问题。 您必须找到那段代码,并且可以直接使用它(如果它是静态方法)或从那里抽象出来。

您可能想在 Gallery2 论坛上提问 - 那里甚至可能已经回答了。

使用 Google Codesearch,我发现 main.php 似乎已经有执行此操作的代码:

$path = GalleryDataCache::getCachePath(
    array('type' => 'fast-download', 'itemId' => $itemId));

$path 似乎是一个文件,包含该文件时可能提供您需要的变量。

【讨论】:

    【解决方案3】:

    这是使用 Gallery2 API 的方法。我把它写成一个方便的功能。

    function get_g2_path($id) {
      include("embed.php");
      GalleryEmbed::init();
      list ($ret, $photo) = GalleryCoreApi::loadEntitiesById($id);
      if ($ret) { return null; }
      list ($ret, $path) = $photo->fetchPath();
      if ($ret) { return null; }
      return $path;
    }
    
    // Here's an example of how you'd call it:
    print get_g2_path(8161);
    

    一些注意事项:

    1. 您必须提供正确的 embed.php 文件的路径 自带 Gallery2
    2. 你只想打电话 GalleryEmbed::init() 一次 请求,所以如果你想调用这个 函数两次,移动前两个 其他地方的函数行
    3. 你可能想做点什么 稍微理智一点的错误 处理

    【讨论】:

    • 这是完美的 - 非常感谢。如果我现在可以奖励你的赏金,我会的。
    • 另一个跟进 - 这会返回路径,有时它来自缓存。这些缓存的图像有时是小缩略图。有什么方法可以检索到全尺寸图像的路径?
    • 当然。在这种情况下,您只需要从缓存的图像(称为衍生图像)回溯到其源。这是执行此操作的代码: include("embed.php"); GalleryEmbed::init();函数 get_g2_path($id) { list ($ret, $entity) = GalleryCoreApi::loadEntitiesById($id); if ($ret) { 返回空值; } switch ($entity->getClassName()) { case "GalleryDerivativeImage": return get_g2_path($entity->getDerivativeSourceId());休息; case "GalleryPhotoItem": list ($ret, $path) = $entity->fetchPath(); if ($ret) { 返回空值; } 返回$路径; } }
    • (抱歉,显然您无法在 cmets 中格式化代码。希望您能理解这一点)
    • 非常感谢您 - 这太不可思议了。效果很好。
    【解决方案4】:

    很明显,在 main.php 中,查询参数被解析为真实路径。随便做什么就行了?

    如果您需要一些帮助,请发布一些 main.php 代码,我会帮助您。

    【讨论】:

    • 我实际上已经尝试过了——Gallery 中的代码非常抽象和复杂。只是想知道是否有更简单的方法来解决路径。
    【解决方案5】:

    假设这只是使用“位置”重定向,那么您应该能够使用以下函数为您执行此操作

    function resolve_url($url)
    {
        $location = $url;
        $lastlocation = '';
    
        while ($location != $lastlocation)
        {
            $lastlocation = $location;
            $context = stream_context_create(
                array(
                    'method' => 'GET'
                )
            );
    
            $metadata = stream_get_meta_data(fopen($location, 'rb', false, $context));
    
            $headers = $metadata['wrapper_data'];
    
            foreach($headers AS $header)
            {
                if (preg_match("^Location: (.*)", $header, $parts))
                {
                    $location = $parts[1];
                }
            }
        }
    
        return $location;
    }
    

    【讨论】:

      【解决方案6】:

      如果你只是想改变img src url,你可以使用gallery2的rewrite module并重写

      <img src='gallery/main.php?g2_view=core.DownloadItem&g2_itemId=8161&g2_serialNumber=2'>
      

      <img src='images/gallery/album1/file1.jpg'>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-24
        • 2016-11-19
        • 1970-01-01
        • 2013-10-25
        • 2016-09-14
        • 1970-01-01
        • 2013-08-24
        • 1970-01-01
        相关资源
        最近更新 更多