Antworten:
Sie können den folgenden Code verwenden, um den tatsächlichen Pfad von public abzurufen: //.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$realpath = $wrapper->realpath();
// ...
}
Dieser Code ist die vereinfachte Version des von verwendeten Codes file_create_url()
mit den folgenden Unterschieden:
$wrapper->getExternalUrl()
da das OP nach dem Pfad fragt, nicht nach der URLWenn das OP die URL für public: // haben wollte, hätte ich den folgenden Code verwendet, der immer noch eine vereinfachte Version des von der Drupal-Funktion verwendeten Codes ist, der allgemeiner sein muss.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$url = $wrapper->getExternalUrl();
}
file_create_url()
; Sie werden sehen, dass der ausgeführte Code in diesem Fall genau der ist, den ich in meiner Antwort geschrieben habe.
file_create_url()
die Sie gibt.
/var/www/webroot/etc/more_folders/
Sie können die Funktion file_create_url verwenden.
$uri = 'public://';
$path= file_create_url($uri)
global $base_url
, um ihn zu entfernen und diesen Server agnostisch zu machen. global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);
Stellen Sie sicher, dass Sie das '#' in der regulären Ausdrucksweise verwenden. Andernfalls schlägt das Ersetzen aufgrund eines nicht maskierten '/' in der $ base_url fehl.
Falls Sie nur lokale Dateien verwenden ( nicht remote! ), Können Sie auch versuchen, drupal_realpath ()
$path = 'public://custom_map';
drupal_realpath($path);
Es wird zurückkehren:
D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map
Siehe die folgenden Beispiele:
$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);
}
oder:
$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
$path = $wrapper->getDirectoryPath() . "/" . file_uri_target($uri);
print $path;
Überprüfen Sie die API auf DrupalPublicStreamWrapper
.
Die Verwendung von file_create_url()
funktioniert nicht in allen Fällen (wie in den anderen Antworten angegeben), da sich die zurückgegebene URL nicht auf demselben Server befinden muss. Und die Verwendung $_SERVER['DOCUMENT_ROOT']
funktioniert nur für bestimmte Serverkonfigurationen.
Wenn Sie keine Stream-Wrapper verwenden möchten, können Sie eine einfachere Lösung ausprobieren:
$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);
Wenn Sie etwas benötigen, das allgemeiner funktioniert, überprüfen Sie die Lösung von @ 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.
}
Lesen Sie weiter: Wie kann ich eine Datei uri in einen relativen Pfad konvertieren?
Verbunden: