Respuestas:
Puede usar el siguiente código para obtener la ruta real de public: //.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$realpath = $wrapper->realpath();
// ...
}
Este código es la versión simplificada del código utilizado por file_create_url()
, con las siguientes diferencias:
$wrapper->getExternalUrl()
porque el OP pregunta por la ruta, no por la URLSi el OP quisiera la URL para public: //, habría utilizado el siguiente código, que sigue siendo una versión simplificada del código utilizado por la función Drupal, que debe ser más genérica.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$url = $wrapper->getExternalUrl();
}
file_create_url()
; verá que el código ejecutado, en este caso, es exactamente el que escribí en mi respuesta.
file_create_url()
te da a ti.
/var/www/webroot/etc/more_folders/
Puede usar la función file_create_url .
$uri = 'public://';
$path= file_create_url($uri)
global $base_url
para eliminarla y hacer que este servidor sea agnóstico. global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);
Asegúrese de usar el '#' en la expresión regular, de lo contrario, el reemplazo fallará debido a un '/' sin escape en $ base_url.
En caso de que solo use archivos locales (¡ no remotos! ), También puede probar drupal_realpath ()
$path = 'public://custom_map';
drupal_realpath($path);
Regresará:
D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map
Vea los siguientes ejemplos:
$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);
}
o:
$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
$path = $wrapper->getDirectoryPath() . "/" . file_uri_target($uri);
print $path;
Verifica API para DrupalPublicStreamWrapper
.
El uso file_create_url()
no funciona en todos los casos (como sugieren las otras respuestas), porque la URL devuelta no tiene que estar en el mismo servidor. Y el uso $_SERVER['DOCUMENT_ROOT']
funciona solo para ciertas configuraciones de servidor.
Si no desea utilizar envoltorios de flujo, puede intentar una solución más simple:
$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);
De lo contrario, si necesita algo que funcione de manera más general, consulte la solución de @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.
}
Leer más: ¿Cómo puedo convertir una uri de archivo en una ruta relativa?
Relacionado: