PHP, wie man eine Ebene höher auf Dirname (__ FILE__) geht

80

Ich habe eine Ordnerstruktur wie folgt:

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

Ich habe eine Zeichenfolge aus der Datenbank '../Folder-B/image1.jpg', die auf ein Bild in Ordner B verweist.

In einem Skript in Ordner A verwende ich dirname ( FILE ), um den Dateinamen abzurufen, und erhalte mydomain.com/Folder-A. In diesem Skript muss ich eine Zeichenfolge erhalten, die besagt 'mydomain.com/Folder-B/image1.jpg. Ich habe es versucht

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

Dies zeigt sich als mydomain.com%2FFolder-A%2F..%2FFolder-B%2Fimage1.jpg

Dies gilt für eine Facebook-Freigabeschaltfläche, mit der nicht das richtige Bild abgerufen werden kann. Weiß jemand, wie man den Weg richtig findet?

Bearbeiten: Ich hoffe, eine URL zu erhalten >>> mydomain.com% 2FFolder-B% 2Fimage1.jpg

aVC
quelle
Diese Antwort von Petah beantwortet die Frage tatsächlich besser als die akzeptierte Antwort. (Es sagt Ihnen tatsächlich, wie Sie ein Level
aufsteigen können

Antworten:

200

Für PHP <5.3 verwenden Sie:

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

In PHP 5.3 bis 5.6 verwenden Sie:

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

In PHP> = 7.0 verwenden Sie:

$upOne = dirname(__DIR__, 1);
Petah
quelle
Das Problem ist, dass meine Zieldatei als ../Folder-B/image1.jpg in der Datenbank gespeichert wird. Mit Ihrem und meinem Ansatz erhalte ich also mydomain.com/Folder-A/../Folder-B/image1.jpg. Die Schaltfläche "Teilen" erkennt es jedoch nicht. Wenn ich dies in einen Browser kopiere, scheint das richtige Bild abgerufen zu werden.
AVC
1
@Petah - Ich habe Stunden damit verbracht und dann realpath()aus deinem Beitrag herausgefunden. Mein letztes Problem mit der Ausgabe wurde perfekt gelöst, danke!
James
1
Diese Antwort beantwortet tatsächlich die Frage. Die akzeptierte Antwort bietet lediglich eine Problemumgehung, um das Problem zu vermeiden, sagt uns jedoch nicht, "wie man mit dirname ( FILE ) eine Ebene höher geht ". Gut gemacht.
Byson
1
Alternativer Weg:dirname(__DIR__)
Nefelim
@Nefelim ja, das wird in den anderen Antworten erwähnt.
Petah
19

Wenn Sie PHP 7.0+ haben, können Sie Levels verwenden.

dirname( __FILE__, 2 ) Mit dem zweiten Parameter können Sie die Anzahl der Ebenen definieren, zu denen Sie zurückkehren möchten.

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

Bas van Dijk
quelle
17

Versuche dies

dirname(dirname( __ FILE__))

Bearbeiten: "./" wurde entfernt, da die Syntax nicht korrekt ist. Ohne es funktioniert es perfekt.

Abhishek
quelle
6

Sie können die Dirname-Funktion von PHP verwenden. <?php echo dirname(__DIR__); ?>. Dadurch erhalten Sie den Namen des übergeordneten Verzeichnisses von __DIR__, in dem das aktuelle Verzeichnis gespeichert ist.

Shane
quelle
Ich habe das versucht, und ich kann die URL bekommen. Das Problem ist, ich habe ein ../ im Namen meiner Zieldatei, das in der Datenbank gespeichert ist. Ich muss das in der endgültigen URL loswerden.
AVC
Vielleicht ein regulärer Ausdruck, etwas in der Art von: /[^\/\‹+\.\.\/?\/ Verwenden Sie diesen Ausdruck, um das übergeordnete /../ aus dem Pfad zu entfernen. "sollte" funktionieren, habe aber nicht getestet.
Shane
Entschuldigung, ich habe einen kleinen Fehler im obigen regulären Ausdruck gemacht ,? \ / Sollte eigentlich sein? /
Shane
Kein Problem, ich dachte, es wäre ein Tippfehler. Ich habe das Problem durch zusätzliches Lesen herausgefunden. Vielen Dank für Ihre Kommentare :)
AVC
Beste Lösung IMHO
Nefelim
1

Sie können verwenden realpath, um unnötige Teile zu entfernen:

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

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

Unter Windows ersetzen Sie diese \bei /Bedarf auch durch die URL.


quelle
1
dirname(__DIR__,level);
dirname(__DIR__,1);

Stufe ist, wie oft Sie zum Ordner zurückkehren

dılo sürücü
quelle
0

Eine Ebene höher habe ich verwendet:

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

oder für php <5.3:

str_replace(basename(dirname(__FILE__)) . '/' . basename(__FILE__), '', realpath(__FILE__)) . '/required.php';
Calin Rusu
quelle
0

Für wen, Deaktivierung mit Share-Hosting-Umgebung und immer noch die Chance, aktuelles PHP unter 7.0 zu haben Wer es nicht hat dirname( __FILE__, 2 );, kann Folgendes verwenden.

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
quelle
-3

Ich benutze dies, wenn es einen absoluten Pfad gibt (dies ist ein Beispiel):

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

Wenn ein Bild zu zeigen ist, reicht dies aus:

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

quelle