php как подняться на один уровень вверх по имени каталога (__ FILE__)


80

У меня структура папок следующая:

mydomain.com
  ->Folder-A
  ->Folder-B

У меня есть строка из базы данных "../Folder-B/image1.jpg", которая указывает на изображение в папке-B.

Внутри скрипта в папке A я использую имя каталога ( FILE ) для получения имени файла и получаю mydomain.com/Folder-A. Внутри этого скрипта мне нужно получить строку с надписью 'mydomain.com/Folder-B/image1.jpg. Я старался

$path=dirname(__FILE__).'/'.'../Folder-B/image1.jpg';

Это отображается как mydomain.com%2FFolder-A%2F..%2FFolder-B%2Fimage1.jpg

Это кнопка общего доступа в facebook, и при этом не удается получить правильное изображение. Кто-нибудь знает, как правильно получить путь?

Изменить: я надеюсь получить URL-адрес >>> mydomain.com% 2FFolder-B% 2Fimage1.jpg


Этот ответ Петаха на самом деле отвечает на вопрос лучше, чем принятый ответ. (Это на самом деле говорит вам, как подняться на уровень выше, а не только как избежать этого.)
Байсон

Ответы:


206

Для PHP <5.3 используйте:

$upOne = realpath(dirname(__FILE__) . '/..');

В PHP с 5.3 по 5.6 используйте:

$upOne = realpath(__DIR__ . '/..');

В PHP> = 7.0 используйте:

$upOne = dirname(__DIR__, 1);

Проблема в том, что мой целевой файл сохраняется в базе данных как ../Folder-B/image1.jpg. Итак, с вашим подходом, а также моим, я получаю mydomain.com/Folder-A/../Folder-B/image1.jpg. Кнопка «Поделиться» не распознает его, хотя если я скопирую это в браузер, похоже, будет получено правильное изображение.
aVC

1
@Petah - Я потратил на это несколько часов, потом узнал realpath()из вашего сообщения. Моя последняя проблема с выходом решена отлично, спасибо!
Джеймс

1
Этот ответ фактически отвечает на вопрос. Принятый ответ просто предоставляет обходной путь, чтобы избежать проблемы, но на самом деле не говорит нам, «как подняться на один уровень выше по имени каталога ( ФАЙЛ )». Отлично сработано.
Byson

1
Альтернативный способ:dirname(__DIR__)
Нефелим

@Nefelim да, это упоминается в других ответах.
Petah


17

Попробуй это

dirname(dirname( __ FILE__))

Изменить: удален "./", потому что это неправильный синтаксис. Без него отлично работает.


6

Вы можете использовать функцию dirname PHP. <?php echo dirname(__DIR__); ?>. Это даст вам имя родительского каталога __DIR__, в котором хранится текущий каталог.


Я пробовал это и могу получить URL. проблема в том, что у меня есть ../ в имени моего целевого файла, который сохраняется в базе данных. Мне нужно избавиться от этого в конечном URL.
aVC

Может быть, регулярное выражение, что-то вроде: / [^\/\ ]+\.\.\/?\/ Используйте это, чтобы удалить родительский /../ из пути. «должен» работать, однако не тестировал.
Шейн

Извините, я допустил небольшую ошибку в приведенном выше регулярном выражении,? \ / На самом деле должно быть? /
Шейн

Нет проблем, я решил, что это опечатка. Я выяснил проблему с помощью дополнительного чтения. Спасибо за комментарии :)
aVC

Лучшее решение IMHO
Nefelim

1

Вы можете использовать realpathдля удаления ненужной части:

// One level up
echo str_replace(realpath(dirname(__FILE__) . '/..'), '', realpath(dirname(__FILE__)));

// Two levels etc.
echo str_replace(realpath(dirname(__FILE__) . '/../..'), '', realpath(dirname(__FILE__)));

На окнах также заменить \с в /случае необходимости , что в URL.



0

На один уровень выше я использовал:

str_replace(basename(__DIR__) . '/' . basename(__FILE__), '', realpath(__FILE__)) . '/required.php';

или для php <5.3:

str_replace(basename(dirname(__FILE__)) . '/' . basename(__FILE__), '', realpath(__FILE__)) . '/required.php';

0

Кому, имея дело с разделяемой средой хостинга и все еще шанс иметь Current PHP менее 7.0 Кому нет, dirname( __FILE__, 2 );можно использовать следующее.

function dirname_safe($path, $level = 0){
    $dir = explode(DIRECTORY_SEPARATOR, $path);
    $level = $level * -1;
    if($level == 0) $level = count($dir);
    array_splice($dir, $level);
    return implode($dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
}

print_r(dirname_safe(__DIR__, 2));

-3

Я использую это, если есть абсолютный путь (это пример):

$img = imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT']."/Folder-B/image1.jpg");

если есть фотография, достаточно:

echo("<img src='/Folder-B/image1.jpg'>");
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.