Uzyskaj prawdziwą ścieżkę do pliku

11

Tworzę moduł do czytania Excela w Drupal 8. Chcę uzyskać prawdziwą ścieżkę pliku do odczytu z ścieżki takiej jak public: //2016-03/Places.xls.

Jaką funkcję powinienem wywołać, aby uzyskać prawdziwą ścieżkę do pliku?

Nisam
źródło
4
Do czytania z czym? Ta ścieżka działa z prawie wszystkim, np. File_get_contents ('public: // ...') działa dobrze.
Berdir
1
Otrzymałem odpowiedź w kategoriach drupal 8 to `\ Drupal :: service ('file_system') -> realpath ('public: //2016-03/Places_2.xlsx')`
Nisam
1
Opublikuj go jako odpowiedź i zaakceptuj jako rozwiązanie. Pomoże to innym z tym samym pytaniem.
Aram Boyajyan
1
Miałem podobną sytuację, ale skończyło się na pliku file_create_url, ponieważ może obsłużyć managed files (These are files that have either been uploaded by users or were generated automatically (for example through CSS aggregation))ishipped files (those outside of the files directory, which ship as part of Drupal core or contributed modules or themes)
usernameabc

Odpowiedzi:

16

Wreszcie znalazłem rozwiązanie, kopiąc kod Drupala.
Możemy uzyskać prawdziwą ścieżkę lub ścieżkę bezwzględną za pomocą usługi file_system .

$absolute_path = \Drupal::service('file_system')->realpath('public://2016-03/Places_2.xlsx');
Nisam
źródło
4
czy są to pliki przesyłane przez Drupal? Co się stanie, jeśli będą one hostowane na zewnątrz? 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.wspomniana jest dokumentacja dla FileSystem :: realpath
usernameabc
13

Odpowiedź @Nisam była prawidłowa, ale teraz jest przestarzała: function drupal_realpath

Przestarzałe

w Drupal 8.0.x-dev, zostaną usunięte przed Drupal 9.0.0. Użyj \ Drupal \ Core \ File \ FileSystem :: realpath ().

Dlatego powinieneś użyć FileSystem :: realpath .

Przykład:

$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
źródło