Получить реальный путь к файлу

11

Я создаю модуль чтения Excel в Drupal 8. Я хочу получить реальный путь к файлу для чтения по пути, например public: //2016-03/Places.xls.

Какую функцию я должен вызвать для получения реального пути к файлу?

Nisam
источник
4
Для чтения с чем? Этот путь работает практически со всем, например, file_get_contents ('public: // ...') работает просто отлично.
Бердир
1
Я получил ответ с точки зрения drupal 8: `\ Drupal :: service ('file_system') -> realpath ('public: //2016-03/Places_2.xlsx')`
Nisam
1
Отправьте это как ответ и примите это как решение. Это поможет другим с тем же вопросом.
Арам Бояджян
1
У меня была похожая ситуация, но в итоге я пошел с file_create_url, потому что он может обрабатывать managed files (These are files that have either been uploaded by users or were generated automatically (for example through CSS aggregation))иshipped files (those outside of the files directory, which ship as part of Drupal core or contributed modules or themes)
usernameabc

Ответы:

16

Наконец, я нашел решение, копая код Drupal.
Мы можем получить реальный или абсолютный путь с помощью сервиса file_system .

$absolute_path = \Drupal::service('file_system')->realpath('public://2016-03/Places_2.xlsx');
Nisam
источник
4
это для загрузки файлов через Drupal? Что произойдет, если они размещены снаружи? 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.упоминается документация для FileSystem :: realpath
usernameabc
13

Ответ @Nisam был верным, но теперь он устарел: функция drupal_realpath

Устаревшее

в Drupal 8.0.x-dev, будет удален до Drupal 9.0.0. Используйте \ Drupal \ Core \ File \ FileSystem :: realpath ().

Поэтому вы должны использовать FileSystem :: realpath .

Пример:

$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
источник