Holen Sie sich den realen Pfad einer Datei

11

Ich erstelle ein Excel-Lesemodul in Drupal 8. Ich möchte den tatsächlichen Pfad einer Datei zum Lesen aus einem Pfad wie public: //2016-03/Places.xls abrufen.

Welche Funktion sollte ich aufrufen, um den tatsächlichen Pfad einer Datei abzurufen?

Nisam
quelle
4
Zum Lesen mit was? Dieser Pfad funktioniert mit fast allem, z. B. funktioniert file_get_contents ('public: // ...') einwandfrei.
Berdir
1
Ich habe die Antwort in Bezug auf Drupal 8 erhalten: \ Drupal :: service ('file_system') -> realpath ('public: //2016-03/Places_2.xlsx')
Nisam
1
Poste es als Antwort und akzeptiere es als Lösung. Das wird anderen bei der gleichen Frage helfen.
Aram Boyajyan
1
Ich hatte eine ähnliche Situation, ging aber schließlich zu file_create_url, weil es managed files (These are files that have either been uploaded by users or were generated automatically (for example through CSS aggregation))undshipped files (those outside of the files directory, which ship as part of Drupal core or contributed modules or themes)
usernameabc

Antworten:

16

Schließlich bekam ich die Lösung durch Graben von Drupal-Code.
Wir können den realen Pfad oder den absoluten Pfad mithilfe des Dienstes file_system ermitteln .

$absolute_path = \Drupal::service('file_system')->realpath('public://2016-03/Places_2.xlsx');
Nisam
quelle
4
Sind diese für Dateien, die über Drupal hochgeladen werden? Was passiert, wenn sie extern gehostet werden? The use of this method is discouraged, because it does not work for remote URIs. Except in rare cases, URIs should not be manually resolved.Erwähnt wird die Dokumentation für FileSystem :: realpath
usernameabc
13

@Nisam Antwort war richtig, aber jetzt ist es veraltet: Funktion drupal_realpath

Veraltet

in Drupal 8.0.x-dev wird vor Drupal 9.0.0 entfernt. Verwenden Sie \ Drupal \ Core \ File \ FileSystem :: realpath ().

Sie sollten also FileSystem :: realpath verwenden .

Beispiel:

$file = File::load($file_id);
$uri = $file->getFileUri();
$stream_wrapper_manager = \Drupal::service('stream_wrapper_manager')->getViaUri($uri);
$file_path = $stream_wrapper_manager->realpath();
Sanzante
quelle