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 > 3 && $largo < 7) {
$divisor = 1024;
$unidad = 'KB';
}
else if ($largo > 6 && $largo < 10) {
$divisor = pow(1024, 2);
$unidad = 'MB';
}
else if ($largo > 9 && $largo < 12) {
$divisor = pow(1024, 3);
$unidad = 'GB';
}
else {
$divisor = pow(1024, 4);
$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álido.';
}
?>
</pre>
Espero que les sea de utilidad