Как получить путь для публики: //

Мне нужно получить путь для public: //во время выполнения. Есть ли функция, которую я могу использовать для ее получения?

39 голосов | спросил vintorg 11 Jam1000000amFri, 11 Jan 2013 03:26:05 +040013 2013, 03:26:05

4 ответа


32

Вы можете использовать следующий код, чтобы получить реальный путь public: //.

if ($ wrapper = file_stream_wrapper_get_instance_by_uri ('public: //')) {
  $ realpath = $ wrapper-> realpath ();
  //...
}

Этот код является упрощенной версией кода, используемого file_create_url (), со следующими отличиями:

  • Он не позволяет сторонним модулям изменять URL-адрес, поскольку OP запрашивает путь, связанный с public: //
  • Он не проверяет, содержит ли URI: //, поскольку это явно верно
  • Он не проверяет, что URI является корневым URI, поскольку это явно ложно для public: //
  • Он не проверяет, что URI является относительным протоколом, поскольку это явно неверно в случае OP
  • Он не проверяет, что URI не является правильно отформатированным потоком, так как public: //является правильно отформатированным потоком
  • Он не проверяет, является ли схема http или https, так как в этом случае public
  • Он не вызывает $ wrapper-> getExternalUrl (), поскольку OP запрашивает путь, а не URL

Если OP захотел URL для public: //, я бы использовал следующий код, который по-прежнему является упрощенной версией кода, используемого функцией Drupal, который должен быть более общим.

if ($ wrapper = file_stream_wrapper_get_instance_by_uri ('public: //')) {
  $ url = $ wrapper-> getExternalUrl ();
}
ответил kiamlaluno 11 Jam1000000amFri, 11 Jan 2013 03:30:46 +040013 2013, 03:30:46
35

Вы можете использовать функцию file_create_url .

$ uri = 'public: //';
$ path = file_create_url ($ uri)
ответил junedkazi 11 Jam1000000amFri, 11 Jan 2013 03:31:54 +040013 2013, 03:31:54
17

Если вы используете только локальные файлы ( не удаленный! ), вы также можете попробовать drupal_realpath ()

$ path = 'public: //custom_map';
drupal_realpath ($ путь);

Он вернется:

D: \ Work \ OpenServer \ домены \ local.testsite.com \ сайтов \ умолчанию \ файлы \ custom_map
ответил Andrey Rudenko 8 Mayam14 2014, 01:32:41
3

См. следующие примеры:

$ scheme = file_uri_scheme ($ file);

if ($ schem & & file_stream_wrapper_valid_scheme ($ scheme)) {
  $ wrapper = file_stream_wrapper_get_instance_by_scheme (схема $);
  $ path = $ wrapper-> getLocalPath ($ file);
}

или

$ wrapper = file_stream_wrapper_get_instance_by_uri ($ uri);
$ path = $ wrapper-> getDirectoryPath (). "/". file_uri_target ($ URI);
print $ path;

Проверить API для DrupalPublicStreamWrapper .

Использование file_create_url () не работает во всех случаях (как указывают другие ответы), так как возвращаемый URL-адрес не должен находиться на одном сервере. И использование $ _ SERVER ['DOCUMENT_ROOT'] работает только для определенных конфигураций сервера.

Если вы не хотите использовать обтекатели потоков, вы можете попробовать более простое решение:

$ path = variable_get ('file_public_path', conf_path (). '/files'). '/'. file_uri_target ($ URI);

В противном случае, если вам нужно что-то более общее, проверьте @ hannanxp решение:

$ wrapper = file_stream_wrapper_get_instance_by_uri ($ uri);
if ($ wrapper instanceof DrupalLocalStreamWrapper) {
  $ path = $ wrapper-> getDirectoryPath (). '/'. file_uri_target ($ URI);
}
else {
  //Это не локальный файл, поэтому нет такой вещи, как
  //относительный путь; выполните соответствующую обработку ошибок здесь.
}

Подробнее: Как преобразовать файл uri в относительный путь?


по теме:

ответил kenorb 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 11 Sep 2013 12:54:43 +0400 2013, 12:54:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132