2010-07-08 5 views
5

Tengo un script php que lee un directorio y enumera todos los archivos/directorios en forma de enlace, y funciona, excepto que estoy tratando de que sea recursivo para que cuando elijo otro directorio, nuevamente usa el script para mostrar los archivos dentro. En este momento, cuando selecciono un directorio, simplemente va al listado de apache predeterminado ... cualquier ayuda es apreciada.ayuda con el script PHP para enumerar el directorio necesita ser recursivo

Guión:

<?php 
$dirname = '/drives/Storage/AppsOSs/'; 
$webdirname = '/AppsOSs'; // what the directory appears as from the web browser's point of view 

$dir = opendir($dirname); 
$file_list = ''; 

while(($file = readdir($dir)) != false) { 
if(($file != '.') && ($file != '..')) { 
$file_list .= "<a href=\"$webdirname/$file\">$file</a><br/>"; 
} 
} 

closedir($dir); 
?> 

<p> 
<?=$file_list?> 
</p> 
+1

Puede usar $ dirname como $ dirname = $ _GET ['dirname']; y $ file_list como $ file_list. = "$file
"; pero esto te llevaría a un nuevo nivel de problemas, como personas que intentan enviar comandos como "rm -rf *" a tu $ _GET y tal que necesitarías escapar y desinfectar todos los datos entrantes para que no te topes con problemas, pero probablemente exista una mejor solución – Prix

+0

hmm, sí, prefiero no utilizar GET, trato de evitar eso en su mayor parte ... El problema es cuando hago clic en un directorio, en este momento está enlazando a la ruta directa, y como es un directorio, no un archivo, va al directorio apache. Lo que básicamente quiero hacer es hacer que solo apunte a una ruta directa si el elemento es un archivo (de esa manera se puede descargar) pero si es un directorio, realmente solo quiero recuperar los archivos/directorios dentro de eso y enumerarlos de forma similar a como lo hago ahora con mi script ... Honestamente, no soy el mejor con php, así que estoy teniendo un problema – jz3

+0

Joe - no hay forma de evitar el uso de GET A menos que use POST - usted tiene que actualizar la secuencia de comandos con el nuevo directorio para recorrer y mostrar, o continuamente obtendrá el directorio predeterminado de Apache porque ya no apunta al script sino al directorio físico. –

Respuesta

0

Prueba la RecursivoI terator-Class y DirectoryIterator que son entregados por el SPL (Standard PHP Library). Viene con PHP, por lo que puede ver la documentación en php.net.

ver este enlace:

2

En primer lugar la estructura de su código es horrible - no estoy seguro si eso era una cosa de copiar y pegar o qué. Pero tal como está, estás creando un enlace al directorio en lugar de volver a llamar al script. Pruebe esto:

<?php 
$dirname = (isset($_GET['dir'])) ? $_GET['dir'] : '/drives/Storage/AppsOSs/'; 

if(!$dir = opendir($dirname)) 
{ 
    die("Unable to open $dirname"); 
} 

$file_list = ""; 

while(($file = readdir($dir)) !== false) 
{ 
    if(($file != '.') && ($file != '..')) 
    { 
     if(is_dir($dirname . $file)) 
     { 
      $file_list .= "<a href=\"" . $_SERVER['PHP_SELF'] . "?dir=" . $dirname . $file . "\">" . $file . "</a><br/>"; 
     } 
     else 
     { 
      $file_list .= "<a href=\"$dirname/$file\">$file</a><br/>"; 
     } 
    } 
} 

closedir($dir); 
?> 

<p> 
<?= $file_list; ?> 
</p> 

Es posible que deba modificarlo ligeramente para que funcione con su sistema. Sin embargo, la idea es: si se trata de un archivo, carga la ruta de archivo directamente en el navegador; si es un directorio, vuelva a llamar al script con el nuevo nombre de directorio. Se podría elaborar más con algo como esto:

<?php 
$dirname = (isset($_GET['dir'])) ? $_GET['dir'] : '/drives/Storage/AppsOSs/'; 

if(!$dir = opendir($dirname)) 
{ 
    die("Unable to open $dirname"); 
} 

$dir_arr = array(); 
$file_arr = array(); 

while(($file = readdir($dir)) !== false) 
{ 
    if(($file != '.') && ($file != '..')) 
    { 
     if(is_dir($dirname . $file)) 
     { 
      $dir_arr[] = "<a href=\"" . $_SERVER['PHP_SELF'] . "?dir=" . $dirname . $file . "\">" . $file . "</a>"; 
     } 
     else 
     { 
      $file_arr[] = "<a href=\"$dirname/$file\">$file</a>"; 
     } 
    } 
} 

closedir($dir); 

$dir_list = implode("<br/>", $dir_arr); 
$file_list = implode("<br/>", $file_arr); 
?> 

<p> 
<?= "<h1>Directories</h1>" . $dir_list . "<h1>Files</h1>" . $file_list; ?> 
</p> 

Con esta configuración todos los directorios se enumeran en primer lugar - en lugar de mezclarse alfabéticamente como en el primer ejemplo.

+0

gracias por el marco de ayuda, sí, eso parece exactamente lo que estoy tratando de hacer. La única parte que veo donde podría tener problemas es que los archivos/carpetas a los que intento acceder están fuera de mi DocumentRoot, así que mostrarán todo bien para el directorio codificado, pero cuando intente concatenar la ruta en el navegador cuando elijo un enlace, va a tener una ruta incorrecta porque tratará de virar después de que mi documentRoot – jz3

+0

intenté que funcionara en mi sistema, y ​​parece que casi funciona. La secuencia de comandos funciona bien y los clasifica en archivos/directorios, pero solo funciona para la carga inicial. Si hago clic en un directorio, navega en ese directorio, pero luego no vuelve a ejecutar el script y lo enumera todo como un archivo. Cuando primero elijo un directorio lo hace con una instrucción? Dir = "ruta". Pero una vez que entro en un directorio, y trato de seleccionar otro directorio, o descargar un archivo, ya no usa el script, sino que simplemente intenta vincularlo directamente. – jz3

+0

hola Joe - lo siento, no tengo una Mac, pero sí ejecuto Linux. Entonces, lo que estás diciendo es que cuando generas la página en la primera carga obtienes la lista. Cuando hace clic en el enlace de un directorio, ¿cómo se ve ese enlace? –

Cuestiones relacionadas