Risposte:
È 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:
$wrapper->getExternalUrl()
poiché l'OP richiede il percorso, non l'URLSe 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();
}
file_create_url()
; vedrai che il codice eseguito, in questo caso, è esattamente quello che ho scritto nella mia risposta.
file_create_url()
ti dà.
/var/www/webroot/etc/more_folders/
È possibile utilizzare la funzione file_create_url .
$uri = 'public://';
$path= file_create_url($uri)
global $base_url
per 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.
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
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: