Ответы:
Вы можете использовать следующий код, чтобы получить реальный путь public: //.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$realpath = $wrapper->realpath();
// ...
}
Этот код является упрощенной версией используемого кода file_create_url()
со следующими отличиями:
$wrapper->getExternalUrl()
так как OP запрашивает путь, а не URLЕсли бы ОП требовал URL для public: //, я бы использовал следующий код, который все еще является упрощенной версией кода, используемого функцией 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 в относительный путь?
Связанный: