Come posso ottenere il percorso pubblico: //


43

Devo ottenere il percorso per public: // in fase di esecuzione. C'è una funzione che posso usare per ottenerlo?

Risposte:


34

È possibile utilizzare il seguente codice per ottenere il vero percorso del pubblico: //.

if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $realpath = $wrapper->realpath();
  // ...
}

Questo codice è la versione semplificata del codice utilizzato da file_create_url(), con le seguenti differenze:

  • Non consente ai moduli di terze parti di modificare l'URL, poiché l'OP richiede il percorso associato al pubblico: //
  • Non controlla che l'URI contenga: //, poiché questo è chiaramente vero
  • Non controlla che l'URI sia un URI relativo alla radice, poiché questo è chiaramente falso per il pubblico: //
  • Non controlla che l'URI sia relativo al protocollo, poiché questo è chiaramente falso nel caso dell'OP
  • Non controlla che l'URI non sia uno stream formattato correttamente, poiché public: // è uno stream formattato correttamente
  • Non controlla se lo schema è http o https, poiché in questo caso è pubblico
  • Non chiama $wrapper->getExternalUrl()poiché l'OP richiede il percorso, non l'URL

Se l'OP volesse l'URL per pubblico: //, avrei usato il seguente codice, che è ancora una versione semplificata del codice utilizzato dalla funzione Drupal, che deve essere più generica.

if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $url = $wrapper->getExternalUrl();
}

3
@ Junedkazi è una risposta migliore.
AlessMascherpa,

1
Leggi il codice utilizzato da file_create_url(); vedrai che il codice eseguito, in questo caso, è esattamente quello che ho scritto nella mia risposta.
kiamlaluno

1
questo ti porterà il percorso completo del server, non l'URL.
DrCord,

@DrCord Ti dà la stessa cosa che file_create_url()ti dà.
kiamlaluno

1
no non lo fa, ti dà un percorso del server come/var/www/webroot/etc/more_folders/
DrCord

39

È possibile utilizzare la funzione file_create_url .

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

Questo ti dà l'URL, ma incluso il server. Ho usato un regex semplice e global $base_urlper rimuoverlo e rendere agnostico questo server. global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);Assicurati di usare '#' in regex, altrimenti la sostituzione fallirà a causa di un '/' senza escape in $ base_url.
DrCord,

3
L'OP ha richiesto il percorso, non l'URL.
kiamlaluno

20

Nel caso in cui stai usando solo file locali ( non remoti! ) Puoi anche provare drupal_realpath ()

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

Restituirà:

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

4
Ciò restituisce un percorso e non un URL, che è ciò che la domanda richiede. Secondo me questo è meglio della risposta accettata.
Scott Joudry,

api.drupal.org/api/drupal/includes!file.inc/function/… . drupal_realpath () è deprecato come visto nei commenti.
Wordzilla,

1
@Wordzilla, beh non lo è. Se controllerai la fonte Drupal più recente, ne troverai l'utilizzo in grandi quantità di posti, non è deprecato ma il suo utilizzo deve essere limitato. La documentazione in file.inc dice che è "scoraggiato", ma non deprecato.
Andrey Rudenko,

@ScottJoudry L'OP richiede il percorso pubblico: // , non l'URL.
kiamlaluno

@Wordzilla: i documenti non dicono che è obsoleto; hanno detto che è scoraggiato perché gestisce solo percorsi di file locali (che sarebbe il filesystem pubblico). Dai documenti: "Utilizzare questa funzione solo se si sa che il wrapper di flusso nell'URI utilizza il file system locale e è necessario passare un percorso assoluto a una funzione incompatibile con gli URI di flusso."
GuyPaddock,

3

Vedi i seguenti esempi:

$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;

Controlla API per DrupalPublicStreamWrapper.

L'uso file_create_url()non funziona in tutti i casi (come suggeriscono le altre risposte), perché l'URL restituito non deve trovarsi sullo stesso server. E l'utilizzo $_SERVER['DOCUMENT_ROOT']funziona solo per determinate configurazioni del server.

Se non si desidera utilizzare stream wrapper, è possibile provare una soluzione più semplice:

$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);

Altrimenti se hai bisogno di qualcosa che funzioni più in generale, controlla la soluzione di @ 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.
}

Per saperne di più: Come posso convertire un file uri in percorso relativo?


Relazionato:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.