php jak przejść o jeden poziom wyżej w katalogu (__ FILE__)

80

Mam następującą strukturę folderów:

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

Mam ciąg z bazy danych, który to „../Folder-B/image1.jpg”, który wskazuje na obraz w folderze B.

W skrypcie w folderze A używam dirname ( PLIK ), aby pobrać nazwę pliku i otrzymuję mydomain.com/Folder-A. Wewnątrz tego skryptu potrzebuję napisu 'mydomain.com/Folder-B/image1.jpg. próbowałem

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

To pojawia się jako mydomain.com%2FFolder-A%2F..%2FFolder-B%2Fimage1.jpg

To jest dla przycisku udostępniania na Facebooku, a to nie daje prawidłowego obrazu. Czy ktoś wie, jak poprawnie uzyskać ścieżkę?

Edycja: mam nadzieję uzyskać adres URL >>> moja_domena.com% 2FFolder-B% 2Fimage1.jpg

aVC
źródło
Ta odpowiedź Petah faktycznie odpowiada na pytanie lepiej niż przyjęta odpowiedź. (W rzeczywistości mówi ci, jak przejść na wyższy poziom, a nie tylko jak uniknąć konieczności.)
Byson,

Odpowiedzi:

206

Dla PHP <5.3 użyj:

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

W PHP 5.3 do 5.6 użyj:

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

W PHP> = 7.0 użyj:

$upOne = dirname(__DIR__, 1);
Petah
źródło
Problem polega na tym, że mój plik docelowy jest zapisywany w bazie danych jako ../Folder-B/image1.jpg. Tak więc z Twoim podejściem, a także moim, otrzymuję mojadomena.com/Folder-A/../Folder-B/image1.jpg. Przycisk udostępniania go nie rozpoznaje, ale jeśli skopiuję to do przeglądarki, wydaje się, że pobiera poprawny obraz.
aVC
1
@Petah - spędziłem nad tym wiele godzin, a potem odkryłem realpath()z twojego postu. Doskonale rozwiązałem mój ostatni problem z wyjściem, dziękuję!
James
1
Ta odpowiedź faktycznie odpowiada na pytanie. Zaakceptowana odpowiedź stanowi tylko obejście problemu, ale tak naprawdę nie mówi nam „jak przejść o jeden poziom wyżej w katalogu ( PLIK )”. Dobra robota.
Byson,
1
Alternatywny sposób:dirname(__DIR__)
Nefelim,
@Nefelim yea, o którym mowa w innych odpowiedziach.
Petah
19

Jeśli masz php 7.0+, możesz użyć poziomów.

dirname( __FILE__, 2 ) za pomocą drugiego parametru możesz zdefiniować liczbę poziomów, o które chcesz wrócić.

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

Bas van Dijk
źródło
17

Spróbuj tego

dirname(dirname( __ FILE__))

Edycja: usunięto „./”, ponieważ nie jest to poprawna składnia. Bez tego działa idealnie.

Abhishek
źródło
6

Możesz użyć funkcji dirname PHP. <?php echo dirname(__DIR__); ?>. W ten sposób otrzymasz nazwę katalogu nadrzędnego __DIR__, w którym jest przechowywany katalog bieżący.

Shane
źródło
Próbowałem tego i mogę uzyskać adres URL. problem polega na tym, że mam ../ w nazwie mojego pliku docelowego, który jest zapisany w bazie danych. Muszę się tego pozbyć w końcowym adresie URL.
aVC
Może to wyrażenie regularne, coś w stylu: /[^\/\]+\.\.\/?\/ Użyj tego, aby usunąć rodzica /../ ze ścieżki. „powinien” działać, nie testowałem jednak.
Shane
Przepraszam, popełniłem niewielki błąd w powyższym wyrażeniu regularnym,? \ / Powinno być? /
Shane
Nie ma problemu, pomyślałem, że to literówka. Rozwiązałem problem po dodatkowym czytaniu. Dzięki za komentarze :)
aVC
Najlepsze rozwiązanie IMHO
Nefelim
1

Możesz użyć, realpathaby usunąć nieprzyjemną część:

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

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

W systemie Windows zamień również \w /razie potrzeby na ten w adresie URL.


źródło
1
dirname(__DIR__,level);
dirname(__DIR__,1);

poziom oznacza, ile razy wrócisz do folderu

dılo sürücü
źródło
0

Jeden poziom wyżej, użyłem:

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

lub dla php <5.3:

str_replace(basename(dirname(__FILE__)) . '/' . basename(__FILE__), '', realpath(__FILE__)) . '/required.php';
Calin Rusu
źródło
0

Do kogo, bez współdzielenia środowiska hostingowego i nadal szansa na posiadanie aktualnego PHP poniżej 7.0 Kto nie ma, dirname( __FILE__, 2 );to jest możliwość użycia następujących.

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));
Deniz Porsuk
źródło
-3

Używam tego, jeśli istnieje ścieżka bezwzględna (to jest przykład):

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

jeśli jest zdjęcie do pokazania, to wystarczy:

echo("<img src='/Folder-B/image1.jpg'>");

źródło