Odpowiedzi:
Możesz użyć następującego kodu, aby uzyskać prawdziwą ścieżkę public: //.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$realpath = $wrapper->realpath();
// ...
}
Ten kod jest uproszczoną wersją używanego kodu file_create_url()
, z następującymi różnicami:
$wrapper->getExternalUrl()
ponieważ OP prosi o ścieżkę, a nie o adres URLGdyby OP chciał, aby adres URL był publiczny: //, użyłbym następującego kodu, który wciąż jest uproszczoną wersją kodu używanego przez funkcję Drupal, która musi być bardziej ogólna.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$url = $wrapper->getExternalUrl();
}
file_create_url()
; zobaczysz, że wykonany kod jest w tym przypadku dokładnie tym, który napisałem w mojej odpowiedzi.
file_create_url()
daje.
/var/www/webroot/etc/more_folders/
Możesz użyć funkcji file_create_url .
$uri = 'public://';
$path= file_create_url($uri)
global $base_url
aby go usunąć i uczynić ten serwer agnostycznym. global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);
Upewnij się, że używasz „#” w wyrażeniu regularnym, w przeciwnym razie zastąpienie nie powiedzie się z powodu nieskasowanego znaku „/” w $ base_url.
Jeśli używasz tylko plików lokalnych ( nie zdalnych! ), Możesz także wypróbować drupal_realpath ()
$path = 'public://custom_map';
drupal_realpath($path);
Zwróci:
D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map
Zobacz następujące przykłady:
$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);
}
lub:
$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
$path = $wrapper->getDirectoryPath() . "/" . file_uri_target($uri);
print $path;
Sprawdź API dla DrupalPublicStreamWrapper
.
Używanie file_create_url()
nie działa we wszystkich przypadkach (jak sugerują inne odpowiedzi), ponieważ zwracany adres URL nie musi znajdować się na tym samym serwerze. Używanie $_SERVER['DOCUMENT_ROOT']
działa tylko w przypadku niektórych konfiguracji serwerów.
Jeśli nie chcesz używać owijania strumieniowego, możesz wypróbować prostsze rozwiązanie:
$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);
W przeciwnym razie, jeśli potrzebujesz czegoś, co działa bardziej ogólnie, sprawdź rozwiązanie @ 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.
}
Czytaj więcej: Jak przekonwertować plik URI na ścieżkę względną?
Związane z: