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.

Russ
źródło
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.

mpdonadio
źródło
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();
Kevin Howbrook
źródło
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);
inizio
źródło
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();
ProGrammar
źródło