Відповіді:
Ви можете використовувати наступний код, щоб отримати реальний шлях public: //.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$realpath = $wrapper->realpath();
// ...
}
Цей код є спрощеною версією використовуваного коду file_create_url()
з такими відмінностями:
$wrapper->getExternalUrl()
оскільки ОП запитує шлях, а не URL-адресуЯкби ОП бажала URL-адреси для загальнодоступних: //, я б використав наступний код, який все ще є спрощеною версією коду, який використовується функцією Drupal, який повинен бути більш загальним.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$url = $wrapper->getExternalUrl();
}
file_create_url()
; ви побачите виконаний код, в даному випадку - саме той, про який я написав у своїй відповіді.
file_create_url()
вам.
/var/www/webroot/etc/more_folders/
Ви можете використовувати функцію file_create_url .
$uri = 'public://';
$path= file_create_url($uri)
global $base_url
видалити його і зробити цей сервер агностиком. global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);
Не забудьте використати "#" у регулярному виразі, інакше заміна не вдасться через невідкладений "/" в $ base_url.
Якщо ви використовуєте лише локальні файли ( не віддалені! ), Ви також можете спробувати drupal_realpath ()
$path = 'public://custom_map';
drupal_realpath($path);
Він повернеться:
D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map
Дивіться наступні приклади:
$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);
}
або:
$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
$path = $wrapper->getDirectoryPath() . "/" . file_uri_target($uri);
print $path;
Перевірте API на DrupalPublicStreamWrapper
.
Використання file_create_url()
не працює у всіх випадках (як підказують інші відповіді), оскільки повернута URL-адреса не повинна бути на одному сервері. А використання $_SERVER['DOCUMENT_ROOT']
працює лише для певних конфігурацій сервера.
Якщо ви не хочете використовувати обтікачі потоків, ви можете спробувати більш просте рішення:
$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);
В іншому випадку, якщо вам потрібно щось, що працює в більш загальному вигляді, перевірте рішення @ 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.
}
Детальніше: Як я можу перетворити файл uri у відносний шлях?
Пов'язані: