Как получить абсолютный путь для файлов на основе FID

13

Как я могу получить абсолютный путь к файлу на основе FID? Извините, если это повторение, я выполнил поиск, но не смог найти ответ.

Russ
источник
Я мог бы найти способ получить его, используя $ base_url + оставшийся путь к файлам + uri, это лучший способ?
Расс

Ответы:

35

Drupal 7

Это процесс , из двух частей, с использованием file_load()иfile_create_url()

Во-первых, вам нужно превратить $ fid в URI Drupal:

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

Теперь вы можете превратить это в URL

$url = file_create_url($uri);

file_create_url()всегда создает абсолютный URL, либо используя глобальный, $base_pathкоторый вы определили, либо используя тот, который Drupal угадал во время начальной загрузки.

mpdonadio
источник
1
Я удивлен, что вам нужно загрузить файл только для того, чтобы получить путь, похоже, пустая трата ресурсов.
Расс
2
@Russ загружает объект файла, а не сам файл. Вы также можете сделать db_query для получения URI, но я стараюсь использовать API как можно больше.
mpdonadio
Спасибо, я подумал, что просто подумал, что будет чистая функция, которая сможет вернуть ее за один шаг. Может быть, что-то, чтобы рассмотреть в Drupal 8.
Расс
1
В вашем примере у вас есть 'field_load ($ fid)', это должно быть 'file_load ($ fid)'.
Стив Малвихилл
2
@ SteveMulvihill Вау, хороший улов. Четыре + года и 33 голоса, и никто этого не заметил.
mpdonadio
3

В Drupal 7 вы также можете использовать запрос MYSQL, если вы не хотите загружать все поля файла

  $ fid = 1; // идентификатор вашего файла
  $ uri = db_select ('file_managed', 'f')
    -> условие ('f.fid', $ fid, '=')
    -> поля ('f', массив ('uri'))
    -> Execute () -> fetchField ();
  echo file_create_url ($ uri);
Inizio
источник
3

Drupal 8

$file = \Drupal\file\Entity\File::load($file_id);
$uri = $file->getFileUri();
$url = \Drupal\Core\Url::fromUri(file_create_url($uri))->toString();
Кевин Хаубрук
источник
1

Они оба работают для меня в 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
источник