jak uzyskać bezwzględną ścieżkę do plików opartych na FID


13

Jak mogę uzyskać bezwzględną ścieżkę do pliku opartego na FID? Przepraszam, jeśli to powtórzenie, przeprowadziłem wyszukiwanie, ale nie mogłem znaleźć odpowiedzi.


Mógłbym znaleźć sposób na uzyskanie go za pomocą $ base_url + pozostała ścieżka do plików + uri, czy to najlepszy sposób?
Russ

Odpowiedzi:


35

Drupal 7

Jest to dwuczęściowy proces, wykorzystujący file_load()ifile_create_url()

Najpierw musisz zmienić $ fid w identyfikator URI Drupala:

$file = file_load($fid);
$uri = $file->uri;

Teraz możesz zmienić to w adres URL

$url = file_create_url($uri);

file_create_url()zawsze tworzy bezwzględny adres URL, albo przy użyciu $base_pathzdefiniowanego globalnie , albo przy użyciu tego, który Drupal odgadł podczas ładowania.


1
Dziwię się, że musisz załadować plik tylko po to, aby uzyskać ścieżkę, wydaje się marnowaniem zasobów.
Russ

2
@Russ Ładuje obiekt pliku, a nie sam plik. Możesz również wykonać komendę db_query, aby uzyskać identyfikator URI, ale staram się używać interfejsu API tak często, jak to możliwe.
mpdonadio

Dzięki, pomyślałem, że właśnie pomyślałem, że będzie czysta funkcja, która zwróci ją w jednym kroku. Może coś do rozważenia w drupalu 8.
Russ

1
W twoim przykładzie masz „field_load ($ fid)”, powinno to być „file_load ($ fid)”.
Steve Mulvihill,

2
@ SteveMulvihill Wow, nice catch. Cztery lata i 33 głosy i nikt tego nie zauważył.
mpdonadio

4

Drupal 8

$file = \Drupal\file\Entity\File::load($file_id);
$uri = $file->getFileUri();
$url = \Drupal\Core\Url::fromUri(file_create_url($uri))->toString();

3

W Drupal 7 możesz także użyć zapytania MYSQL, jeśli nie chcesz ładować wszystkich pól pliku

  $ fid = 1; // twój identyfikator pliku
  $ uri = db_select ('file_managed', 'f')
    -> warunek („f.fid”, $ fid, '= ”)
    -> pola („f”, tablica („uri”))
    -> execute () -> fetchField ();
  echo file_create_url ($ uri);

1

Oba działają dla mnie w Drupal 8:

// top of file
use Drupal\file\Entity\File;
use Drupal\Core\Url;

// load the file object from some file id
$file_object = File::load(123);

// way 1
$file_uri = $file_object->uri->value;
$file_url = file_create_url($file_uri);

// way 2
$file_uri = $file_object->getFileUri();
$file_url = Url::fromUri(file_create_url($file_uri))->toString();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.