Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



sábado, 23 de junio de 2012

PHP: Generar listados de archivos contenidos en alguna carpeta de tu servidor web

PHP: Generar listados de archivos contenidos en alguna carpeta de tu servidor web

He creado una web, para alojar un proyecto de un juego.
Se me ha presentado el siguiente problema:
 -Los usuarios pueden subir archivos a la web (mapas del juego y una captura de pantalla)
-  ademas yo mismo subo las nuevas versiones, incluyendo un pequeño archivo de texto, donde cuento las mejoras incluidas y los errores corregidos...

¿como lo hago que automaticamente se genere una tabla, que presente los enlaces de descarga de los archivos, imagenes o textos?


Pues con un simple archivo en PHP. Aprobeche el fichero que daba el servidor por defecto para mostar los archivos, y le añadir crear una table y que en la segunda columna mostrar o la imagen del archivo o el texto.

El truco que hice es que el archivo que subo, al subir su imagen (o texto de version), conservo el mismo nombre, y le hago añado una terminación  (.ver (si es texto) ).
Hay un bucle for, en el programa, que crea una lista de archivos a mostrar en la tabla, con la terminacion ".ver", lo que hace es cuando crea la lista de archivo no añado a la lista los archivo que contengan ".ver" (ni los directorios, para que no se vean). Creandose una lista solo conlos archivos que me interesan.

Luego hay otro bucle for, para ir creando el archivo .html, alli pillara el nombre de la lista, y en la 2º columna, le añade al nombre la terminacion ".ver", para que coincida con el fichero de texto.

Os enseño como quedo el resultado:




Os dejo el codigo del programa, de PHP:



<?
$host=$_SERVER['HTTP_HOST'];
/*
Directory Listing Script - Version 2
====================================
Script Author: Ash Young <ash@evoluted.net>. www.evoluted.net
Layout: Manny <manny@tenka.co.uk>. www.tenka.co.uk
Modificado por JSBSAN para generar tabla de los archivos e insercion de imagen o textos
*/
$startdir = '.';
$showthumbnails = false;
$showdirs = true;
$forcedownloads = false;
$hide = array(
'dlf',
'public_html',
'index.php',
'Thumbs',
'.htaccess',
'.htpasswd'
);
$displayindex = false;
$allowuploads = false;
$overwrite = false;


$indexfiles = array (
'index.html',
'index.htm',
'default.htm',
'default.html'
);

$filetypes = array (
'png' => 'jpg.gif',
'jpeg' => 'jpg.gif',
'bmp' => 'jpg.gif',
'jpg' => 'jpg.gif',
'gif' => 'gif.gif',
'zip' => 'archive.png',
'rar' => 'archive.png',
'exe' => 'exe.gif',
'setup' => 'setup.gif',
'txt' => 'text.png',
'htm' => 'html.gif',
'html' => 'html.gif',
'php' => 'php.gif',
'fla' => 'fla.gif',
'swf' => 'swf.gif',
'xls' => 'xls.gif',
'doc' => 'doc.gif',
'sig' => 'sig.gif',
'fh10' => 'fh10.gif',
'pdf' => 'pdf.gif',
'psd' => 'psd.gif',
'rm' => 'real.gif',
'mpg' => 'video.gif',
'mpeg' => 'video.gif',
'mov' => 'video2.gif',
'avi' => 'video.gif',
'eps' => 'eps.gif',
'gz' => 'archive.png',
'asc' => 'sig.gif',
);

error_reporting(0);
if(!function_exists('imagecreatetruecolor')) $showthumbnails = false;
$leadon = $startdir;
if($leadon=='.') $leadon = '';
if((substr($leadon, -1, 1)!='/') && $leadon!='') $leadon = $leadon . '/';
$startdir = $leadon;


if($_GET['dir']) {
//check this is okay.

if(substr($_GET['dir'], -1, 1)!='/') {
$_GET['dir'] = $_GET['dir'] . '/';
}

$dirok = true;
$dirnames = split('/', $_GET['dir']);
for($di=0; $di<sizeof($dirnames); $di++) {

if($di<(sizeof($dirnames)-2)) {
$dotdotdir = $dotdotdir . $dirnames[$di] . '/';
}

if($dirnames[$di] == '..') {
$dirok = false;
}
}

if(substr($_GET['dir'], 0, 1)=='/') {
$dirok = false;
}

if($dirok) {
$leadon = $leadon . $_GET['dir'];
}
}






$opendir = $leadon;
if(!$leadon) $opendir = '.';
if(!file_exists($opendir)) {
$opendir = '.';
$leadon = $startdir;
}


clearstatcache();
if ($handle = opendir($opendir)) {
while (false !== ($file = readdir($handle))) {
//first see if this file is required in the listing
if ($file == "." || $file == ".." || $file=="error_log" || $file=="default.php" ) continue;


if (strpos($file, ".png")!==FALSE) CONTINUE;


if (strpos($file, ".php")!==FALSE) CONTINUE;


if (strpos($file, ".ver")!==FALSE) CONTINUE;


$discard = false;
for($hi=0;$hi<sizeof($hide);$hi++) {
if(strpos($file, $hide[$hi])!==false) {
$discard = true;
}
}

if($discard) continue;
if (@filetype($leadon.$file) == "dir") {
if(!$showdirs) continue;

$n++;
if($_GET['sort']=="date") {
$key = @filemtime($leadon.$file) . ".$n";
}
else {
$key = $n;
}
$dirs[$key] = $file . "/";
}
else {
$n++;
if($_GET['sort']=="date") {
$key = @filemtime($leadon.$file) . ".$n";
}
elseif($_GET['sort']=="size") {
$key = @filesize($leadon.$file) . ".$n";
}
else {
$key = $n;
}
$files[$key] = $file;

if($displayindex) {
if(in_array(strtolower($file), $indexfiles)) {
header("Location: $file");
die();
}
}
}
}
closedir($handle);
}


//sort our files




@ksort($files, SORT_NUMERIC);




//order correctly




$dirs = @array_values($dirs); $files = @array_values($files);




?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Versiones Guerra de Estrellas </title>
<link rel="stylesheet" type="text/css" href="http://cpanel.main-hosting.com/images/index/styles.css" />
<link href="http://jsbsanblog.16mb.com/estrellas/menu_assets/styles.css" rel="stylesheet" type="text/css">
</head>


<table border=1>
<div id="container">


<h1>Versiones....</h1>

<div id="listingcontainer">

<div id="listing">
<?
$class = 'b';
if($dirok) {
?>
<div><a href="<?=$dotdotdir;?>" class="<?=$class;?>"><img src="http://cpanel.main-hosting.com/images/index/dirup.png" alt="Folder" /><strong>..</strong> <em>-</em>
<?=date ("M d Y h:i:s A", filemtime($dotdotdir));?>
</a></div>
<?
if($class=='b') $class='w';
else $class = 'b';
}
$arsize = sizeof($dirs);
for($i=0;$i<$arsize;$i++) {
?>
<div><a href="<?=$leadon.$dirs[$i];?>" class="<?=$class;?>"><img src="http://cpanel.main-hosting.com/images/index/folder.png" alt="<?=$dirs[$i];?>" /><strong>
<?=$dirs[$i];?>
</strong> <em>-</em>
<?=date ("M d Y h:i:s A", filemtime($leadon.$dirs[$i]));?>
</a></div>
<?
if($class=='b') $class='w';
else $class = 'b';
}

$arsize = sizeof($files);


array_multisort($files, SORT_DESC);
for($i=0;$i<$arsize;$i++) {
$icon = 'unknown.png';
$ext = strtolower(substr($files[$i], strrpos($files[$i], '.')+1));
$supportedimages = array('gif', 'png', 'jpeg', 'jpg');
$thumb = '';

if($filetypes[$ext]) {
$icon = $filetypes[$ext];
}

$filename = $files[$i];
if(strlen($filename)>43) {
$filename = substr($files[$i], 0, 40) . '...';
}

$fileurl = $leadon . $files[$i];
?>
<tr><td>
<div><a href="<?=$fileurl;?>" class="<?=$class;?>"<?=$thumb2;?>><img src="http://cpanel.main-hosting.com/images/index/<?=$icon;?>" alt="<?=$files[$i];?>" /><strong>
<?=$filename;?>
</strong> <em>
<?=round(filesize($leadon.$files[$i])/1024);?>
KB</em>
<?=date ("M d Y h:i:s A", filemtime($leadon.$files[$i]));?>
<?=$thumb;?>
</a></td><td><? $archivo = file($files[$i] . ".ver"); $lineas = count($archivo); for($ia=0; $ia < $lineas; $ia++){ echo $archivo[$ia]; } ?>
</td></tr></div>
<?
if($class=='b') $class='w';
else $class = 'b';
}
?>
</div>
</div>
</div>
<div id="copy"><? $c_global_f = get_cfg_var('c_global_f'); if (!empty($c_global_f)) echo $c_global_f; ?></div>
</table>
</body>
</html>