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


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

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


17

Spróbuj tego

dirname(dirname( __ FILE__))

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


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.


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.



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

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

-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'>");
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.