web-dev-qa-db-fra.com

Comment obtenir le chemin d'accès public: //

J'ai besoin d'obtenir le chemin pour public: // lors de l'exécution. Y a-t-il une fonction que je peux utiliser pour l'obtenir?

45
vintorg

Vous pouvez utiliser le code suivant pour obtenir le vrai chemin 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:

  • Il ne permet pas aux modules tiers de modifier l'URL, car l'OP demande le chemin associé à public: //
  • Il ne vérifie pas que l'URI contient: //, car c'est clairement vrai
  • Il ne vérifie pas que l'URI est un URI relatif à la racine, car cela est clairement faux pour public: //
  • Il ne vérifie pas que l'URI est relatif au protocole, car c'est clairement faux dans le cas de l'OP
  • Il ne vérifie pas que l'URI n'est pas un flux correctement formaté, car public: // est un flux correctement formaté
  • Il ne vérifie pas si le schéma est http ou https, car dans ce cas, il est public
  • Il n'appelle pas $wrapper->getExternalUrl() puisque l'OP demande le chemin, pas l'URL

Si 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();
}
35
kiamlaluno

Vous pouvez utiliser la fonction file_create_url .

$uri = 'public://';
$path= file_create_url($uri)
40
junedkazi

Si vous utilisez uniquement des fichiers locaux ( non distants! ), vous pouvez également essayer drupal_realpath ()

$path = 'public://custom_map';
drupal_realpath($path);

Il renverra:

D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map
22
Andrey Rudenko

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 de 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 de $_SERVER['DOCUMENT_ROOT'] Ne fonctionne que pour certaines configurations de serveur.

Si vous ne souhaitez pas utiliser de 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 plus généralement, vérifiez la solution @ 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 puis-je convertir un fichier uri en chemin relatif?


En relation:

3
kenorb