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


Ця відповідь Петаха насправді відповідає на питання краще, ніж прийнята відповідь. (Це насправді говорить вам про те, як піднятися на рівень вище, а не просто про те, як уникнути необхідності.)
Byson

Відповіді:


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()з вашого допису. Чудово вирішив мій останній нігл з результатом, дякую!
James

1
Ця відповідь фактично відповідає на питання. Прийнята відповідь просто надає обхідний шлях, щоб уникнути проблеми, але насправді не говорить нам, "як піднятися на один рівень вище по імені ( ФАЙЛ )". Молодці.
Byson

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

@Nefelim так, про що згадується в інших відповідях.
Петах,


17

Спробуйте це

dirname(dirname( __ FILE__))

Змінити: вилучено "./", оскільки це неправильний синтаксис. Без цього він працює ідеально.


6

Ви можете використовувати функцію перейменування PHP. <?php echo dirname(__DIR__); ?>. Це дасть вам ім’я батьківського каталогу __DIR__, в якому зберігається поточний каталог.


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

Можливо, регулярний вираз, щось на зразок: /[^\/\]+\.\.\/?\/ Використовуйте це, щоб видалити батьківський /../ із шляху. "повинен" працювати, проте не тестував.
Шейн

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

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

Найкраще рішення ІМХО
Нефелім

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);

рівень - це скільки разів ви повернетесь до папки


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

Для кого, взаємодія з хостинговим середовищем спільного користування і все ще шанс мати поточний 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.