Jawaban:
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:
$wrapper->getExternalUrl()
karena OP meminta path, bukan untuk URLJika 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();
}
file_create_url()
; Anda akan melihat kode yang dieksekusi, dalam hal ini, persis yang saya tulis dalam jawaban saya.
file_create_url()
memberi Anda.
/var/www/webroot/etc/more_folders/
Anda dapat menggunakan fungsi file_create_url .
$uri = 'public://';
$path= file_create_url($uri)
global $base_url
untuk 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.
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
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: