Réponses:
Vous pouvez utiliser le code suivant pour obtenir le chemin réel de public: //.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$realpath = $wrapper->realpath();
// ...
}
Ce code est la version simplifiée du code utilisé par file_create_url()
, avec les différences suivantes:
$wrapper->getExternalUrl()
puisque l'OP demande le chemin, pas l'URLSi l'OP voulait l'URL pour public: //, j'aurais utilisé le code suivant, qui est toujours une version simplifiée du code utilisé par la fonction Drupal, qui doit être plus générique.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$url = $wrapper->getExternalUrl();
}
file_create_url()
; vous verrez que le code exécuté, dans ce cas, est exactement celui que j'ai écrit dans ma réponse.
file_create_url()
vous.
/var/www/webroot/etc/more_folders/
Vous pouvez utiliser la fonction file_create_url .
$uri = 'public://';
$path= file_create_url($uri)
global $base_url
pour le supprimer et rendre ce serveur agnostique. global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);
Assurez-vous d'utiliser le '#' dans l'expression régulière, sinon le remplacement échouera à cause d'un '/' non échappé dans $ base_url.
Si vous utilisez uniquement des fichiers locaux ( pas à distance! ), Vous pouvez également essayer drupal_realpath ()
$path = 'public://custom_map';
drupal_realpath($path);
Il reviendra:
D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map
Voir les exemples suivants:
$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);
}
ou:
$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
$path = $wrapper->getDirectoryPath() . "/" . file_uri_target($uri);
print $path;
Vérifiez l'API pour DrupalPublicStreamWrapper
.
L'utilisation file_create_url()
ne fonctionne pas dans tous les cas (comme le suggèrent les autres réponses), car l'URL renvoyée ne doit pas nécessairement se trouver sur le même serveur. Et l'utilisation $_SERVER['DOCUMENT_ROOT']
ne fonctionne que pour certaines configurations de serveur.
Si vous ne souhaitez pas utiliser les wrappers de flux, vous pouvez essayer une solution plus simple:
$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);
Sinon, si vous avez besoin de quelque chose qui fonctionne de manière plus générale, vérifiez la solution 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.
}
En savoir plus: Comment convertir un fichier URI en chemin relatif?
En relation: