como obter o caminho absoluto para arquivos com base no fid

13

Como posso obter o caminho absoluto para um arquivo com base no fid? Desculpe se isso é uma repetição, fiz uma pesquisa, mas não consegui encontrar a resposta.

Russ
fonte
Eu poderia ter descoberto uma maneira de obtê-lo usando o $ base_url + o caminho restante para arquivos + uri é este o melhor caminho?
Russ

Respostas:

35

Drupal 7

Este é um processo em duas partes, usando file_load()efile_create_url()

Primeiro, você precisa transformar o $ fid em um URI do Drupal:

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

Agora, você pode transformar isso em um URL

$url = file_create_url($uri);

file_create_url()sempre cria uma URL absoluta, usando a global $base_pathque você definiu ou usando a que Drupal adivinhou durante a inicialização.

mpdonadio
fonte
1
Estou surpreso que você tenha que carregar o arquivo apenas para pegar o caminho, parece um desperdício de recursos.
Russ
2
@ Russ Está carregando o objeto de arquivo, não o próprio arquivo. Você também pode fazer um db_query para obter a uri, mas tento usar a API o máximo possível.
mpdonadio
Obrigado, imaginei que, apenas pensei que haveria uma função limpa que poderia devolvê-la em uma única etapa. Talvez algo a considerar em Drupal 8.
Russ
1
No seu exemplo, você tem 'field_load ($ fid)', ele deve ser 'file_load ($ fid)'.
Steve Mulvihill
2
@SteveMulvihill Uau, boa captura. Quatro + anos e 33 votos, e ninguém percebeu isso.
mpdonadio
3

No Drupal 7, você também pode usar a consulta MYSQL, se não quiser carregar todos os campos do arquivo

  $ fid = 1; // seu ID de arquivo
  $ uri = db_select ('gerenciado por arquivo', 'f')
    -> condição ('f.fid', $ fid, '=')
    -> campos ('f', array ('uri'))
    -> execute () -> fetchField ();
  eco file_create_url ($ uri);
inizio
fonte
3

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
fonte
1

Ambos estão trabalhando para mim no 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
fonte