Nasıl programlı bir görüntünün GERÇEK URL / Path elde edebilirsiniz?

6 Cevap php

Başlık soruyu açıklığa kavuşturmak için, ben gibi bir kod var:

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

dosya aslında Webroot altında dosya sisteminde ikamet eden. Gerçek yol gibi sunulmakta görüntüleri almak için PHP herhangi bir yolu var mı:

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

Örneğin bir_işlev (longURL) ==> images/gallery/album1/file1.jpg

Teşekkür ederim,

6 Cevap

I'm quite sure, Gallery2 (which you are apparently using) has an internal method for this - at least it does this resolving at some place. You'd have to find that piece of code and could either use it directly (if it's e.g. a static method) or abstract it from there.

Sen Gallery2 forumlarında sormak isteyebilirsiniz - bu bile zaten orada yanıtlanmış olabilir.

Google codesearch kullanarak, main.php zaten bunu yapmak için koduna sahip göründüğü tespit ettik:

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

$path belki gerekir değişkenler sağlar dahil olduğunda bir dosya gibi görünüyor.

Bu url göz önüne alındığında, bunun muhtemelen bir veritabanından resmin yolunu gidiyor demektir, o g2_itemId=8161 kullanıyor anlamak oldukça kolaydır.

Akılda bu mantık ile, veritabanını sorgulamak ve programlı istediğiniz yolu alabilirsiniz.

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

İşte Gallery2 API kullanarak bunu yapmak için yolu. Ben bir kolaylık fonksiyonu olarak yazdı.

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

Bazı notlar:

  1. you have to provide the right path to the embed.php file that comes with Gallery2
  2. you only want to call GalleryEmbed::init() once per request, so if you want to call this function twice, move the first two lines of the function somewhere else
  3. you probably want to do something slightly more sane with error handling

Eh tabii ki main.php sorgu parametreleri gerçek bir yola çözümlenir. Sadece orada ne yapıyorsun ne?

Eğer main.php bazı kod biraz yardım sonrası ihtiyacınız varsa ve ben sana yardım edeyim.

Sadece img src url değiştirmek istiyorsanız, galeri2 en rewrite module ve rewrite kullanabilirsiniz

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

karşı

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

Bu sadece yönlendirmeleri "Konum" kullanır varsayarak, o zaman sizin için bunu yapmak için aşağıdaki işlevi kullanmak gerekir

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