Bagaimana cara mendapatkan jalur untuk umum: //


43

Saya perlu mendapatkan jalur untuk publik: // saat runtime. Apakah ada fungsi yang bisa saya gunakan untuk mendapatkannya?

Jawaban:


34

Anda dapat menggunakan kode berikut, untuk mendapatkan jalur publik yang sebenarnya: //.

if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $realpath = $wrapper->realpath();
  // ...
}

Kode ini adalah versi sederhana dari kode yang digunakan oleh file_create_url(), dengan perbedaan berikut:

  • Itu tidak memungkinkan modul pihak ketiga untuk mengubah URL, karena OP meminta jalur yang terkait dengan publik: //
  • Itu tidak memeriksa URI berisi: //, karena ini jelas benar
  • Itu tidak memeriksa URI adalah URI relatif-root, karena ini jelas salah untuk publik: //
  • Itu tidak memeriksa URI adalah protokol relatif, karena ini jelas salah dalam kasus OP
  • Itu tidak memeriksa URI bukan aliran yang diformat dengan benar, karena publik: // adalah aliran yang diformat dengan benar
  • Itu tidak memeriksa apakah skema itu http atau https, karena dalam hal ini adalah publik
  • Itu tidak memanggil $wrapper->getExternalUrl()karena OP meminta path, bukan untuk URL

Jika OP menginginkan URL untuk publik: //, saya akan menggunakan kode berikut, yang masih merupakan versi sederhana dari kode yang digunakan oleh fungsi Drupal, yang harus lebih umum.

if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $url = $wrapper->getExternalUrl();
}

3
@ junedkazi adalah jawaban yang lebih baik.
AlessMascherpa

1
Baca kode yang digunakan oleh file_create_url(); Anda akan melihat kode yang dieksekusi, dalam hal ini, persis yang saya tulis dalam jawaban saya.
kiamlaluno

1
ini akan memberi Anda jalur server lengkap, bukan url.
DrCord

@DrCord Memberi Anda hal yang sama yang file_create_url()memberi Anda.
kiamlaluno

1
tidak itu tidak, itu memberi Anda jalur server seperti/var/www/webroot/etc/more_folders/
DrCord

39

Anda dapat menggunakan fungsi file_create_url .

$uri = 'public://';
$path= file_create_url($uri)

Ini memberi Anda url, tetapi termasuk server. Saya menggunakan regex sederhana dan global $base_urluntuk menghapusnya dan membuat server ini agnostik. global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);Pastikan untuk menggunakan '#' di regex, jika tidak ganti akan gagal karena '/' tidak diloloskan di $ base_url.
DrCord

3
OP meminta path, bukan URL.
kiamlaluno

20

Jika Anda hanya menggunakan file lokal ( tidak jauh! ), Anda juga dapat mencoba drupal_realpath ()

$path = 'public://custom_map';
drupal_realpath($path);

Itu akan kembali:

D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map

4
Ini mengembalikan jalur dan bukan URL, yang merupakan pertanyaan yang ditanyakan. Menurut saya ini lebih baik daripada jawaban yang diterima.
Scott Joudry

api.drupal.org/api/drupal/includes!file.inc/function/… . drupal_realpath () tidak digunakan lagi seperti yang terlihat di komentar.
Wordzilla

1
@Wordzilla, yah bukan. Jika Anda akan memeriksa sumber Drupal terbaru Anda akan menemukan penggunaannya di sejumlah besar tempat, itu tidak ditinggalkan tetapi penggunaannya harus dibatasi. Dokumentasi di file.inc mengatakan bahwa itu "tidak disarankan", tetapi tidak usang.
Andrey Rudenko

@ScottJoudry OP meminta jalur untuk publik: // , bukan URL.
kiamlaluno

@Wordzilla: Dokumen tidak mengatakan sudah usang; mereka mengatakan itu tidak disarankan karena hanya menangani jalur file lokal (yang akan menjadi sistem file publik). Dari dokumen: "Hanya gunakan fungsi ini jika Anda tahu bahwa pembungkus aliran di URI menggunakan sistem file lokal, dan Anda harus melewati jalur absolut ke fungsi yang tidak kompatibel dengan aliran URI."
GuyPaddock

3

Lihat contoh-contoh berikut:

$scheme = file_uri_scheme($file);

if ($scheme && file_stream_wrapper_valid_scheme($scheme)) {
  $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
  $path = $wrapper->getLocalPath($file);
}

atau:

$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
$path = $wrapper->getDirectoryPath() . "/" . file_uri_target($uri);
print $path;

Periksa API untuk DrupalPublicStreamWrapper.

Penggunaan file_create_url()tidak berfungsi dalam semua kasus (seperti yang disarankan jawaban lain), karena URL yang dikembalikan tidak harus berada di server yang sama. Dan menggunakan $_SERVER['DOCUMENT_ROOT']hanya berfungsi untuk konfigurasi server tertentu.

Jika Anda tidak ingin menggunakan pembungkus aliran, Anda dapat mencoba solusi yang lebih sederhana:

$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);

Kalau tidak, jika Anda membutuhkan sesuatu yang berfungsi lebih umum, periksa solusi @ hannanxp :

$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
if ($wrapper instanceof DrupalLocalStreamWrapper) {
  $path = $wrapper->getDirectoryPath() . '/' . file_uri_target($uri);
}
else {
  // This does not appear to be a local file so there's no such thing as
  // a relative path; do appropriate error handling here.
}

Baca selengkapnya: Bagaimana saya bisa mengkonversi file uri ke path relatif?


Terkait:

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.