php cómo subir un nivel en dirname (__ FILE__)

80

Tengo una estructura de carpetas de la siguiente manera:

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

Tengo una cadena de la base de datos que es '../Folder-B/image1.jpg', que apunta a una imagen en Folder-B.

Dentro de un script en la Carpeta-A, estoy usando dirname ( FILE ) para buscar el nombre del archivo y obtengo mydomain.com/Folder-A. Dentro de este script, necesito obtener una cadena que diga 'mydomain.com/Folder-B/image1.jpg. Lo intenté

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

Esto se muestra como mydomain.com%2FFolder-A%2F..%2FFolder-B%2Fimage1.jpg

Esto es para un botón para compartir de Facebook y no logra obtener la imagen correcta. ¿Alguien sabe cómo obtener el camino correctamente?

Editar: espero obtener una URL >>> midominio.com% 2FFolder-B% 2Fimage1.jpg

aVC
fuente
Esta respuesta de Petah en realidad responde a la pregunta mejor que la respuesta aceptada. (En realidad, le dice cómo subir de nivel, no solo cómo evitar tener que hacerlo).
Byson

Respuestas:

206

Para PHP <5.3 use:

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

En PHP 5.3 a 5.6 use:

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

En PHP> = 7.0 use:

$upOne = dirname(__DIR__, 1);
Petah
fuente
El problema es que mi archivo de destino se guarda como ../Folder-B/image1.jpg en la base de datos. Entonces, con su enfoque, así como el mío, obtengo mydomain.com/Folder-A/../Folder-B/image1.jpg. El botón de compartir no lo reconoce, aunque si copio esto en un navegador, parece obtener la imagen correcta.
aVC
1
@Petah - Pasé horas en esto, luego lo descubrí realpath()en tu publicación. Resolví mi último problema con la salida a la perfección, ¡gracias!
James
1
Esta respuesta realmente responde a la pregunta. La respuesta aceptada solo proporciona una solución para evitar el problema, pero en realidad no nos dice "cómo subir un nivel en dirname ( FILE )". Bien hecho.
Byson
1
dirname(__DIR__)
Vía
@Nefelim sí, eso se menciona en las otras respuestas.
Petah
17

Prueba esto

dirname(dirname( __ FILE__))

Editar: eliminado "./" porque no es la sintaxis correcta. Sin él, funciona perfectamente.

Abhishek
fuente
6

Puede usar la función dirname de PHP. <?php echo dirname(__DIR__); ?>. Eso le dará el nombre del directorio principal de __DIR__, que almacena el directorio actual.

Shane
fuente
Intenté eso y puedo obtener la URL. el problema es que tengo un ../ en el nombre de mi archivo de destino que está guardado en la base de datos. Necesito deshacerme de eso en la URL final.
AVC
Tal vez una expresión regular, algo como: /[^\/\]+\.\.\/?\/ Use eso para eliminar el padre /../ de la ruta. 'debería' funcionar, sin embargo, no lo he probado.
Shane
Lo siento, cometí un pequeño error en la expresión regular anterior,? \ / Debería ser? /
Shane
No hay problema, pensé que era un error tipográfico. Resolví el problema con algunas lecturas adicionales. Gracias por sus comentarios :)
aVC
La mejor solución en mi humilde opinión
Nefelim
1

Puede usar realpathpara eliminar la parte uniesaria:

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

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

En Windows, también reemplace \con /si es necesario en la URL.


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

el nivel es cuántas veces volverás a la carpeta

dılo sürücü
fuente
0

Un nivel arriba, he usado:

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

o para php <5.3:

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

Para quién, trabajando con el entorno de alojamiento compartido y aún la posibilidad de tener PHP actual menos de 7.0 Quién no lo tiene dirname( __FILE__, 2 );, es posible utilizar lo siguiente.

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

Yo uso esto, si hay una ruta absoluta (este es un ejemplo):

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

si hay una imagen para mostrar, esto es suficiente:

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

fuente