cara mendapatkan path absolut untuk file berdasarkan fid

13

Bagaimana saya bisa mendapatkan path absolut untuk file berdasarkan fid? Maaf jika ini adalah pengulangan, saya melakukan pencarian tetapi tidak dapat menemukan jawabannya.

Russ
sumber
Saya mungkin telah menemukan cara untuk mendapatkannya menggunakan $ base_url + path yang tersisa ke file + uri apakah ini cara terbaik?
Russ

Jawaban:

35

Drupal 7

Ini adalah proses dua bagian, menggunakan file_load()danfile_create_url()

Pertama, Anda perlu mengubah $ fid menjadi URI Drupal:

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

Sekarang, Anda bisa mengubahnya menjadi URL

$url = file_create_url($uri);

file_create_url()selalu membuat URL absolut, baik menggunakan global $base_pathyang telah Anda tetapkan, atau menggunakan yang ditebak Drupal selama bootstrap.

mpdonadio
sumber
1
Saya terkejut Anda harus memuat file hanya untuk mendapatkan jalan, sepertinya buang-buang sumber daya.
Russ
2
@Russ Ini memuat objek file, bukan file itu sendiri. Anda juga bisa melakukan db_query untuk mendapatkan uri, tetapi saya mencoba menggunakan API sebanyak mungkin.
mpdonadio
Terima kasih, saya pikir itu, hanya berpikir akan ada fungsi bersih yang bisa mengembalikannya dalam satu langkah. Mungkin sesuatu untuk dipertimbangkan dalam drupal 8.
Russ
1
Dalam contoh Anda, Anda memiliki 'field_load ($ fid)', seharusnya 'file_load ($ fid)'.
Steve Mulvihill
2
@SteveMulvihill Wow, tangkapan yang bagus. Empat + tahun dan 33 suara, dan tidak ada yang memperhatikan itu.
mpdonadio
3

Di Drupal 7 Anda juga dapat menggunakan permintaan MYSQL, jika Anda tidak ingin memuat semua bidang file

  $ fid = 1; // ID file Anda
  $ uri = db_select ('file_managed', 'f')
    -> kondisi ('f.fid', $ fid, '=')
    -> bidang ('f', array ('uri'))
    -> execute () -> fetchField ();
  echo file_create_url ($ uri);
inizio
sumber
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
sumber
1

Keduanya berfungsi untuk saya di 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
sumber