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

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

Ответы:

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
19

Если у вас установлен php 7.0+, вы можете использовать уровни.

dirname( __FILE__, 2 ) со вторым параметром вы можете определить количество уровней, на которые вы хотите вернуться.

http://php.net/manual/en/function.dirname.php

Бас ван Дейк
источник
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.


источник
1
dirname(__DIR__,level);
dirname(__DIR__,1);

уровень - сколько раз вы вернетесь в папку

dılo sürücü
источник
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'>");

источник