Tema: FAQ's de PHP
Ver Mensaje Individual
  #163 (permalink)  
Antiguo 09/06/2006, 21:44
Avatar de nachopro
nachopro
 
Fecha de Ingreso: noviembre-2003
Ubicación: Haedo, Bs. As.
Mensajes: 290
Antigüedad: 21 años
Puntos: 2
Tema: Listar archivos de directorios+subdirectorios
Prólogo: Ya era hora de devolver un poquito de todo lo que este foro me ha dado

Pregunta: ¿Cómo puedo listar el contenido de una carpeta en mi webserver para la gente pueda descargar archivos, dado que el browser del apache trunca nombres largos y es feo?

Respuesta: Creá un index.php, con el siguiente contenido, y pongo en el directorio que desees (este script permite entrar en los subdirectorios pero no ir más atrás del directorio 'root')

Código PHP:
<?
header
("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0"false);
header("Pragma: no-cache");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Explorando /<? echo $_GET['ruta']; ?></title>
</head>
<body>
<pre>
<?
if (empty($_GET['ruta']) || ereg("^\."$_GET['ruta'])) {
    
$dir './';
}
else {
    
$dir $_GET['ruta'];
}
if (
is_dir($dir)) {
    
    function 
tamano($bytes) {
        
$largo strlen($bytes);
        if (
$largo 4) {
            
$divisor 1;
            
$unidad 'B';
        }
        else if (
$largo && $largo 7) {
            
$divisor 1024;
            
$unidad 'KB';
        }
        else if (
$largo && $largo 10) {
            
$divisor pow(10242);
            
$unidad 'MB';
        }
        else if (
$largo && $largo 12) {
            
$divisor pow(10243);
            
$unidad 'GB';
        }
        else {
            
$divisor pow(10244);
            
$unidad 'TB';
        }
        
$salida[0] = round(($bytes $divisor), 2);
        
$salida[1] = $unidad;
        return 
$salida;
    }

    
$gd opendir($dir);
    if (
$gd) {
        
$rn "\r\n";
        while ((
$archivo readdir($gd)) !== false) {
            if (
ereg("^(.)*\.[a-zA-Z0-9]{1,3}$"$archivo)) {
                if (
$archivo == 'index.php') { break; }
                
$extension strtolower(substr($archivo, -3));
                switch (
$extension) {
                    case 
'mp3':
                    case 
'wma':
                        
$icono 'snd';
                        break;
                    case 
'jpg';
                    case 
'tif';
                    case 
'png';
                        
$icono 'pic';
                        break;                    
                    default:
                        
$icono 'unk';
                        break;
                }
                
                
$iconos [] = $icono;
                
$archivos[] = $archivo;
                
$fechas[] = $fecha;
                
$tamanos[] = tamano(filesize($dir.$archivo));
            }
            else if (
$archivo != '.' && $archivo != '..') {
                
$carpetas[] = $archivo;
            }
        }
        
closedir($gd);
        
        if (
$dir != '.') {
            
$ruta explode('/'$_GET['ruta']);
            
$tot_subdir count($ruta) - 2;
            
krsort($ruta);
            
$volver '<img src="bck.png"> <a href="?ruta=';
            for (
$i 0$i $tot_subdir$i++) {
                
$volver .= $ruta[$i].'/';
            }
            
$volver .= '">volver</a>'.$rn;
            echo 
$volver;
        }
        
        if (
is_array($carpetas)) {
            
natcasesort($carpetas);
            foreach (
$carpetas as $valor) {
                echo 
'<img src="fol.png"> <a href="?ruta='.$_GET['ruta'].urlencode($valor).'/">'.$valor.'</a>    '.$rn;
            }
        }
        
        if (
is_array($archivos)) {
            if (
natcasesort($archivos)) {
                foreach (
$archivos as $clave => $valor) {
                    echo 
'<img src="'.$iconos[$clave].'.png"> <a href="'.$dir.urlencode($valor).'">'.$valor.'</a>    ';
                    
printf("%6.2f "$tamanos[$clave][0]);
                    echo 
$tamanos[$clave][1];
                    echo 
$rn;
                }
            }
        }
    }
}
else {
    echo 
'El directorio \''.$dir.'\' no es v&aacute;lido.'
}
?>
</pre>
Espero que les sea de utilidad