<html>
<head><Title>Gestión de ficheros via FTP</title>
<style type="text/css">
#base{font-family:Arial;font-size:12px;color:#0000a0;text-align:center}
#cabezas{font-family:Arial;font-size:10px;color:#0000a0;text-align:center}
#blanco{font-family:Arial;font-size:14px;font-weight:bold;color:#ffffff;text-align:center;background-color:#0000a0}
#gris{font-family:Arial;font-size:13px;font-weight:bold;color:#0000a0;text-align:center;background-color:#eeeeee}
#rojo{font-family:Arial;font-size:14px;font-weight:bold;color:#ff0000;text-align:center}
#rojo1{font-family:Arial;font-size:10px;color:#ff0000;text-align:center}
A:link, A:visited, A:active { text-decoration: none;color:#ff0000}
A:hover(font-style:italic}
</style>
<!-- funcion JavaScript que actualiza los valores del formulario
    y recarga la página con los nuevos valores /-->
<script>
function cambia(valor1,valor2){
     document.forms.pasador.dire.value=valor1;
      document.forms.pasador.transferido.value=valor2;
 document.forms.pasador.submit();

}
</script>
</head>
<body>
<!-- formulario para trasferencia de datos gestionado
      por la función cambia() de JavaScript /-->
<form name="pasador" action="" method="post">
<input type="hidden" name='dire' value="">
<input type="hidden" name='transferido' value="">
</form>
<?
###############################################
# variables con los datos de conexión
################################################
$servidor="localhost";
$usuario="secre";
$password="secre";
###############################################
# variables de controlo de bucles y escritura
##############################################
$control="c_";
$escribe="";
$cabecera=="";
#################################################
#conexion al servidor FTP
if(!$x=@ftp_connect ($servidor,21)){echo "No se activo lo conexión FTP";exit();}
# identificación del usuario en el servidor FTP
if(!@ftp_login($x,$usuario,$password)){echo "Error en login o password";exit();}
###########################################
## elección del directorio (raiz o el valor transferido desde el formulario)
###################################
if(!$_REQUEST['dire']){
    
$dire="/";
}else{
    
$dire=$_REQUEST['dire'];
    }
#comprobación de los permisos de acceso al directorio elegido, en caso de no tenerlos
# finaliza el proceso y acaba la ejecución
if(!@ftp_chdir($x,$dire)){
        print 
"No tienes permisos de acceso a este directorio";
        exit();
    } 
# comtrol de transferencia de archivos. Comprueba errores de transferencia
# y da un mensaje de aviso de error si lo hubiera
if($_FILES['archivo']['error']!=0){
 
$controla=" no ha podido transferirse.<BR> Se ha producido un error".$_FILES['archivo']['error']."<BR> en el proceso de transferencia.";
}
################################################
# caso de haber recibido una transferencia de fichero
###############################################
if(!empty($_FILES["archivo"]) AND $_FILES['archivo']['error']==0){
                    
$nombre_archivo=$_FILES['archivo']['name'].".gz";
                    
#abre el archivo temporal transferido
            
$cadena='';
# abre el fichero temporal transferido y lo lee guardandolo
# en la variable $cadena
          
$f1=fopen($_FILES['archivo']['tmp_name'],"r");    
                          while (!
feof($f1)) {
                                 
$cadena .= fgets($f1,1024);
                               }
          
fclose($f1);
# comprime la cadena obtenida del fichero temporal
          
$c1=gzencode($cadena,3,FORCE_GZIP);
#crea un archivo comprimido
          
$f=fopen($nombre_archivo,"w");
          
fwrite($f,$c1);
          
fclose($f);
#cambia al directorio actual del servidor FTP
          
ftp_chdir($x,$dire);
# escribe el fichero en el en directorio FTP
# comprobando si ha podido guardarse
# Si el usuario no tiene permsios de "borrado" en el directorio destino
# y el nombre coincide con uno preexistente dará un mensaje de error
# si tiene permisos para borrar ficheros lo sobreescribiría eliminando el anterior
         
if(@ftp_put($x$nombre_archivo$nombre_archivoFTP_BINARY)){
             
$controla="ha sido transferido con éxito";
          }else{
              
$controla=" no ha podido transferirse.<BR> Probablemente existe<BR> otro archivo con el mismo nombre.";
          }
# borra el archivo comprimido del servidor ftp.
          
unlink($nombre_archivo);
# elimina la variable $_FILES
          
unset($_FILES["archivo"]);
          
}    
#inserta una tabla con cabeceras que indican el nombre de usuario y el directorio actual    
    
?>
<table align=center border=2 bgcolor=#ffffff bordercolor=#eeeeee cellpadding=2 cellspacing=2>
<td colspan=4  id="blanco">Usuario del servicio FTP</td>
<tr id="rojo"><td colspan=4><?=$usuario;?></td><tr>
<td colspan=4  id="blanco">Directorio actual</td>
<tr id="rojo"><td colspan=4><img src='abierto.jpg'>&nbsp;&nbsp;<?=preg_replace('/\/+/''/'$dire);?></td><tr id="chiquiC" align=center>

<?
# lee la lista de ficheros del directorio actual si existen
if($lista=ftp_rawlist($x,$dire)){
# ordena el array lista por nombres
       
sort($lista);
#lee el array que contiene la lista de ficheros
       
foreach($lista as $v){
#extrae los diferentes bloques de la cadena convirtiendolos en elementos de un array
#previamente elimina los espacios repetidos
            
$extrae=explode(" ",preg_replace('/\s+/'' '$v));
#comprueba si existen el fichero de control y si tiene permisos de escriturs
#esto nos indicaría si el usuario puede escribir en el directorio actual
# la variable $escribe habia sido inicializada con valor null
                   
if($extrae[8]==$control){
                       if(
substr($extrae[0],0,1)=="-" AND substr($extrae[0],2,1)=="w"){
                       
$escribe="Si";
                       }
                     
$encontrado="Si";
                  }
    
       }



      foreach(
$lista as $v){
#extrae los diferentes bloques de la cadena convirtiendolos en elementos de un arrya
#previamente elimina los espacios repetidos
            
$extrae=explode(" ",preg_replace('/\s+/'' '$v));
           

# busca los ficheros y directororios que tengan permiso de lectura
# y los guarda en el array listado
            
if ((substr($extrae[0],0,1)=="-" AND substr($extrae[0],1,1)=="r" AND $extrae[8]!=$control)
                       OR
               (
substr($extrae[0],0,1)=="d" AND substr($extrae[0],-3,1)=="r")){
                             
$listado[]=$extrae;      
            }
       }
# comprueba que el array listado contiene algun elemento. De ser así incluye la cabecera de la tabla
# en caso contrario no lo hace
    
if (sizeof($listado)>0){?>
              <td colspan=4 id="blanco">Opciones de descarga vía FTP<BR><tr id="cabezas" align=center>
              <td>Fichero</td><td>Tamaño (bytes)</td><td>Fecha</td><td>Hora</td><tr id='base'>
        
<?
#lee los elementos del array selecciona ficheros de directorios
# en el caso de fichero   escribe los nombres incluyendo un enlace de descarga
# mediante ftp://
# en caso de que sea un directorio incluye una llamada a una función javascript 
# que modifica el value de la variable "dire" del formulario "pasador"
# incluyendo el nombre del directorio elegido, y recarga la página mediante el envio del formulario 
          
for($i=0;$i<sizeof($listado);$i++){
              if (
substr($listado[$i][0],0,1)=="-"){
                     print 
"<td align=left><A href='ftp://".$usuario.":".$password."@".$servidor.$dire."/".$listado[$i][8]."'>&nbsp;&nbsp;<img src='file.gif' border=0>&nbsp;&nbsp;".$listado[$i][8]."</a></td>";
              }else{
                     print 
"<td align=left><A href=\"javascript:cambia('".$dire."/".$listado[$i][8]."','')\"><img src='cerrado.jpg' border=0>&nbsp;&nbsp;" .$listado[$i][8]."</a></td>";
              }
# comprueba la fecha de la ultima modificación de los ficheros
# y en caso de ser menor del tiempo UNIX=0 incluye un espacio el blanco
# si la fecha es correcta extrae la fecha y la hora con el formato indicado
              
if(ftp_mdtm($x,$listado[$i][8])>0){
                 
$fecha=date("d-m-Y",ftp_mdtm($x,$listado[$i][8]));
                 
$hora=date("H:i:s",ftp_mdtm($x,$listado[$i][8]));
               }else{
                 
$fecha="&nbsp;";
                 
$hora="&nbsp;";
               }
# imprime en la tabla el tamaño, fecha y hora de modificación del fichero
              
print "<td align=right>".number_format($listado[$i][4],"" ,".")."</td>";
              print 
"<td align=right>".$fecha."</td>";
              print 
"<td align=center>".$hora."</td><tr  id='base'>"

          }


      }

}
#cierra la conexión ftp

if(empty($lista) OR empty($encontrado)){
                 
$f=fopen($control,"w");
                  
fclose($f);
              if(@
ftp_put($x$control$controlFTP_BINARY)){
              
$escribe="Si";
                  }else{
                     }
            
unlink($control);
}
 
ftp_quit($x);
# incluye el formulario de transferencia de ficheros
# en el caso de que el directorio permita transferencias de fichero
if ($escribe=="Si"){    
          print
"<tr><td colspan='4' id='base'>&nbsp;</td><tr>";
          print 
"<td colspan=4 id='blanco'>Transferir archivos al directorio actual</td><tr>";
# si ha habido una transferencia previa de otro fichero informa sobre el resultado
               
if ($controla!=''){ 
                     print 
"<td colspan='4' id='gris'>El fichero<br><span id='rojo'> ".$nombre_archivo."<br></span>".$controla."</td><tr>";
             }
#incluye el formulario de transferencia del fichero
?>
<td colspan=4 align=center id="rojo1">
Recuerda que los ficheros no pueden sobrepasar los 2 MBytes<br>
<form action="" ENCTYPE="multipart/form-data" method="post" name="form_ftp">
<input name="archivo" type="file">
<input type="hidden" name="dire" value="<?=$dire;?>"><BR><BR><BR>
<input name="submit" type="submit" value="Subir Archivo al servidor FTP">
</form>
</td>
    
<tr>
<td colspan=4 align=center><A href="javascript:cambia('','')";>Volver al directorio raíz</a><BR></table>
<?
         
}else{
    
?>
    <td colspan=4 align=center><A href="javascript:cambia('','')";>Volver al directorio raíz</a><BR></table>
    </table>
    <?
}
?>





</body>
</html>