如何以编程方式获取图像的真实URL /路径?

时间:2009-02-28 04:08:19

标签: php url image

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

<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 )==&gt;图像/画廊/ album1 / file1.jpg

谢谢,

6 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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

您可能想在Gallery2论坛上提问 - 它甚至可能已在那里得到答案。

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

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

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

答案 2 :(得分:1)

以下是使用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. 你可能想做点什么 稍微有点理智和错误 处理

答案 3 :(得分:0)

很明显,在main.php中,查询参数被解析为真实路径。做你在做什么吗?

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

答案 4 :(得分:0)

如果您只想更改img src网址,可以使用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'>

答案 5 :(得分:0)

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

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;
}