Загрузка файла в PHP без знания базовой файловой системы - PullRequest
0 голосов
/ 06 февраля 2009

Одной из важных особенностей PHP является то, что если вы делаете include / require, он работает с каталогом, в котором находится файл (или, скорее, с URI запроса). Это означает, что если вы хотите добавить дополнительный файл, вам не нужно знать, откуда запускается оригинальный скрипт. Все, что вам нужно знать, это где текущий скрипт.

Теперь я хочу загрузить текстовый файл и обработать его. file_get_contents (), кажется, obvioius способ загрузки. Проблема в том, что у меня нет такой роскоши. Мне нужно либо указать путь к файлу абсолютно, чего я не хочу делать, либо я должен знать местоположение относительно файла, который инициировал вызов, что мне тоже не нравится.

Require / include, похоже, не работает с файлами, не относящимися к PHP, и это в любом случае по сути повторяет содержимое (да, я знаю, что могу обернуть это в ob_start () и т. Д.).

Предложения

Ответы [ 10 ]

9 голосов
/ 06 февраля 2009

Вы можете получить каталог, связанный с текущим файлом, используя

dirname(__FILE__)

Так что вы можете сделать что-то вроде этого:

file_get_contents(dirname(__FILE__) . '/foo.txt')
1 голос
/ 06 февраля 2009

Если я правильно понимаю документацию для file_get_contents, вы можете просто передать true в качестве второго параметра, и будет использоваться include_path . Итак, на моей системе

echo file_get_contents('doc/DB/doc/STATUS', true);

будет отображать документ STATUS из моего модуля PEAR, потому что / usr / share / pear находится в моем include_path. И хотя мы это делаем, я не уверен, что include () или require () будут работать с относительными путями, если только не «.» является частью include_path. Я проверю это.

Обновление: хорошо, я проверил. Как оказалось, include () всегда будет учитывать текущий каталог, независимо от того, что говорит include_path.

1 голос
/ 06 февраля 2009

Например, обратите внимание, что «относительный путь» будет от того места, где был запущен в данный момент путь первого php-скрипта (независимо от того, какой файл может выполнять включение »). Невозможность указать относительный путь звучит странно ...

1 голос
/ 06 февраля 2009

Определите константу с вашим желаемым путем к файлу, куда бы вы обычно не помещали параметры конфигурации. Держит это простым и настраиваемым.

0 голосов
/ 06 февраля 2009

Я не знаю, если у вас есть контроль над содержимым файла, который вы пытаетесь загрузить, но если вы это сделаете, вы можете попробовать использовать умный шаблонизатор (http://www.smarty.net/)

Вам нужно будет вставить '{include file = "lative / file / path.ext "}' в файлы, которые вы пытаетесь загрузить, но smarty по крайней мере позаботится о работе со всеми относительными путями. и растерянность для вас.

PS: Документация по тегу include находится здесь: http://www.smarty.net/manual/en/language.function.include.php

0 голосов
/ 06 февраля 2009

Чтобы ответить на ваш вопрос, мне кажется, вам нужно написать собственный эквивалент включения, чтобы вернуть содержимое файла из любого числа возможных путей. Сконфигурируйте последовательность путей в массиве и сделайте так, чтобы ваша функция проходила через него, используйте file_exists () и загружайте содержимое файла, если файл найден.

Функции файловой системы: http://us2.php.net/manual/en/ref.filesystem.php#73954

Также обратите внимание, что есть константы php для разделителя пути к файловой системе, например: DIRECTORY_SEPARATOR, однако он не нужен для переносимых путей к файлам, поскольку косая черта "/" работает в Windows.

PS: трюк, часто используемый в Symfony для получения абсолютных путей:

$path = realpath(dirname(__FILE__)).'/whatever.txt';
0 голосов
/ 06 февраля 2009

require / include разрешают абсолютный путь из обоих путей, текущего файла сценария и исходного исполняемого файла сценария:

Файлы для включения сначала ищутся в каждой записи include_path относительно текущего рабочего каталога, а затем в каталоге текущего скрипта. Например. если include_path - это библиотеки, текущий рабочий каталог - /www/, вы включили include/a.php и в этом файле include "b.php", b.php сначала просматривается в /www/libraries/, а затем в /www/include/. Если filename начинается с ./ или ../, оно просматривается только в текущем рабочем каталоге. - http://docs.php.net/include

Но лучше использовать абсолютные пути, поэтому PHP не нужно «угадывать», какой файл подразумевается.

0 голосов
/ 06 февраля 2009

Проверьте свойства $ _SERVER. http://us2.php.net/manual/en/reserved.variables.server.php

Вы хотите

$_SERVER['DOCUMENT_ROOT'];
0 голосов
/ 06 февраля 2009

Вам понадобится абсолютный путь, чтобы открыть файл. Вы можете использовать realpath () для преобразования относительного пути URL в абсолютный путь.

0 голосов
/ 06 февраля 2009

Необходимость знать путь вещей - обычное явление в мире веб-сайтов. Вы можете сохранить часть пути, например начало, в переменной config, например, $ config ['include_dir']; Задать путь к файлу так же просто, как указать include ($ _ SERVER ['DOCUMENT_ROOT']. '/Include/myinclude.inc.php');

Я не знаю, как еще вы узнали бы, какой файл включить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...