Wie bekomme ich den Pfad für die Öffentlichkeit: //

43

Ich muss den Pfad für public: // zur Laufzeit abrufen. Gibt es eine Funktion, mit der ich es bekommen kann?

vintorg
quelle

Antworten:

34

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:

  • Module von Drittanbietern können die URL nicht ändern, da das OP nach dem mit public: // verknüpften Pfad fragt.
  • Es wird nicht geprüft, ob der URI enthält: //, da dies eindeutig wahr ist
  • Es wird nicht überprüft, ob der URI ein root-relativer URI ist, da dies für public eindeutig falsch ist: //
  • Es wird nicht überprüft, ob der URI protokollbezogen ist, da dies im Fall des OP eindeutig falsch ist
  • Es wird nicht überprüft, ob der URI kein ordnungsgemäß formatierter Stream ist, da public: // ein ordnungsgemäß formatierter Stream ist
  • Es wird nicht geprüft, ob das Schema http oder https ist, da es in diesem Fall öffentlich ist
  • Es ruft nicht auf, $wrapper->getExternalUrl()da das OP nach dem Pfad fragt, nicht nach der URL

Wenn 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();
}
kiamlaluno
quelle
3
@ junedkazi's ist eine bessere Antwort.
AlessMascherpa
1
Lesen Sie den Code von file_create_url(); Sie werden sehen, dass der ausgeführte Code in diesem Fall genau der ist, den ich in meiner Antwort geschrieben habe.
Kiamlaluno
1
Dadurch erhalten Sie den vollständigen Serverpfad, nicht die URL.
DrCord
@ DrCord Es gibt Ihnen die gleiche Sache, file_create_url()die Sie gibt.
kiamlaluno
1
Nein, es gibt Ihnen einen /var/www/webroot/etc/more_folders/
Serverpfad
39

Sie können die Funktion file_create_url verwenden.

$uri = 'public://';
$path= file_create_url($uri)
junedkazi
quelle
Dadurch erhalten Sie die URL, aber einschließlich des Servers. Ich habe einen einfachen regulären Ausdruck verwendet und den 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.
DrCord
3
Das OP fragte nach dem Pfad, nicht nach der URL.
kiamlaluno
20

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
Andrey Rudenko
quelle
4
Dies gibt einen Pfad und keine URL zurück, worum es in der Frage geht. Meiner Meinung nach ist dies besser als die akzeptierte Antwort.
Scott Joudry
api.drupal.org/api/drupal/includes!file.inc/function/… . drupal_realpath () ist veraltet, wie in den Kommentaren zu sehen.
Wordzilla
1
@Wordzilla, na ja, ist es nicht. Wenn Sie die neueste Drupal-Quelle überprüfen, werden Sie feststellen, dass sie an vielen Stellen verwendet wird. Sie ist nicht veraltet, muss aber eingeschränkt werden. Die Dokumentation in file.inc besagt, dass es "entmutigt", aber nicht veraltet ist.
Andrey Rudenko
@ScottJoudry Das OP fragt nach dem Pfad für public: // , nicht nach der URL.
kiamlaluno
@Wordzilla: Die Dokumentation sagt nicht, dass es veraltet ist. Sie sagten, es sei nicht ratsam, weil es nur lokale Dateipfade handhabt (die das öffentliche Dateisystem sein würde). In den Dokumenten: "Verwenden Sie diese Funktion nur, wenn Sie wissen, dass der Stream-Wrapper in der URI das lokale Dateisystem verwendet und Sie einen absoluten Pfad zu einer Funktion übergeben müssen, die mit Stream-URIs nicht kompatibel ist."
GuyPaddock
3

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:

Kenorb
quelle