| Transfiriendo ficheros |
Dos tipos de transferencias
Para tratar de evitarte el confusionismo mental que he tenido que padecer (ya sabes aquello de ... donde Dios no da, Salamanca no presta) empezaré por decirte que mis ideas estuvieron muy confusas hasta que me percaté de que son posibles dos tipos de transferencia:Subir ficheros a un servidor web
Lo primero de todo es comprobar si está activada esta opción. La forma de comprobarlo es recurrir al famoso fichero info.php y a través de el comprobar la configuración de las opción: file_uploads tiene como valor 1.Cuando register_globals está en off
El script que te comento en el párrafo anterior no funcionaría en el caso de que php.ini tuviera configurada en off la opción register_globalsTransferencias FTP
PHP tiene funciones -activas cuando en info.php se ve FTP support como enabled- que permiten efectuar transferencia de ficheros en ambas direcciones, además de las de crear y modificar directorios en el servidor y conocer información sobre los fichero que contienen.Abrir y cerrar conexión
$x=ftp_connect (host,pt)Directorio raíz
El directorio raíz será identificado mediante el símbolo / y será distinto dependiendo del nombre de usuario que hace el login.Información sobre contenidos
ftp_nlist($x, nomdir)Cambiar de directorio
ftp_chdir($x, nuevodir)Crear y borrar directorios en el servidor FTP
ftp_mkdir($x, nomdir)Transferir ficheros
ftp_get($x,nloc,nrem,modo)Modificar ficheros en el servidor FTP
ftp_rename($x,nant,nnuevo)Información sobre ficheros del en el servidor FTP
ftp_size($x,nomfile)
Subir ficheros a un servidor
<HTML> <BODY> <FORM ENCTYPE="multipart/form-data" ACTION="script.php" METHOD="post"> #con este input "oculto" establecemos el limite máximo # del tamaño del fichero a transferir. En este ejemplo 50.000 bytes <INPUT type="hidden" name="lim_tamano" value="50000"> <p><b>Archivo a transferir<b><br> <INPUT type="file" name="archivo"></p> <p><INPUT type="submit" name="enviar" value="Aceptar"></p> </FORM> </BODY> </HTML>
| Ver form63a.html |
<?
if ($archivo != "none" AND $archivo_size != 0
AND $archivo_size<=$lim_tamano){
if (copy ($archivo, $archivo_name)) {
echo "<h2>Se ha transferido el archivo $archivo_name</h2>";
echo "<br>Su tamaño es: $archivo_size bytes<br>";
echo "<br>El fichero es tipo: $archivo_type <br>";
}
}else{
echo "<h2>No ha podido transferirse el fichero</h2>";
echo "<h3>su tamaño no puede exceder de $lim_tamano bytes</h2>";
}
?>
Para el caso de que register_globals=off
<? # recogemeos en variables con el nombre de las usadas en el script anterior # los valores transferidos por $HTTP_POST $archivo_name= $HTTP_POST_FILES['archivo']['name']; $archivo_size= $HTTP_POST_FILES['archivo']['size']; $archivo_type= $HTTP_POST_FILES['archivo']['type']; $archivo= $HTTP_POST_FILES['archivo']['tmp_name']; $lim_tamano= $HTTP_POST_VARS['lim_tamano']; # opción alternativa a la anterior # para versión PHP 4.1.0 o posterior # $archivo_name= $_FILES['archivo']['name']; # $archivo_size= $_FILES['archivo']['size']; # $archivo_type= $_FILES['archivo']['type']; # $archivo= $_FILES['archivo']['tmp_name']; # $MAX_FILE_SIZE= $_POST['lim_tamano']; # a partir de aquí el script es idéntico al anterio if ($archivo != "none" AND $archivo_size != 0 AND $archivo_size<=$lim_tamano){ if (copy ($archivo, $archivo_name)) { echo "<h2>Se ha transferido el archivo $archivo_name</h2>"; echo "<br>Su tamaño es: $archivo_size bytes<br>"; echo "<br>El fichero es tipo: $archivo_type <br>"; } }else{ echo "<h2>No ha podido transferirse el fichero</h2>"; echo "<h3>su tamaño no puede exceder de $lim_tamano bytes</h2>"; } ?>
Una sintaxis alternativa
Probando las funciones de FTP
<? # conexión con el servidor FTP if($x=@ftp_connect ("localhost",21)){ echo "Conexión FTP activada"; }else{ echo "No se activo lo conexión FTP"; } # registro de usuario if(@ftp_login($x,"admin","pepa")){ echo "El login y la password han sido aceptados"; }else{ echo "Error en login o password"; } #desconexión ftp_quit($x); ?>
<? if($x=@ftp_connect ("localhost",21)){ echo "Conexión FTP activada<br>"; }else{ echo "No se activo lo conexión FTP"; } if(@ftp_login($x,"profes","profes")){ echo "El login y la password han sido aceptados<BR><BR>"; }else{ echo "Error en login o password"; } $lista=ftp_nlist($x,"/"); foreach($lista as $c=>$v){ print "Indice: ".$c." Valor: ".$v."<br>"; } print "<H1>Lista completa</H1>"; $listacompleta=ftp_rawlist($x,"/"); foreach($listacompleta as $c=>$v){ print "Indice: ".$c." Valor: <H1>".$v."</H1>"; } ftp_quit($x); ?>

Miscelánea de funciones FTP
<? # Conexión con el el servidor ftp if(!$x=@ftp_connect ("localhost",21)){ echo "No se activo lo conexión FTP"; exit(); } # Identificación de usuario if(!@ftp_login($x,"admin","admin")){ echo "Error en login o password"; exit(); } /* comprobamos el nombre del directorio actual del servidor FTP que será el root correspondiente al usuario registrado */ echo "El directorio actual es: ",ftp_pwd($x),"<br>"; /* intentamos cambiar a un subdirectorio indicando la ruta absoluta partiendo del directorio root del usuario actual. En caso de error (ruta incorrecta o falta de permisos de accesos nos daría un mensaje de error. Si el cambio tiene éxito nos indicaría el nombre del nuevo directorio */ if(!@ftp_chdir($x,"/Apache/htdocs")){ print "No tienes permisos de acceso a este directorio<br>"; print "o la ruta es incorrecta.¡Comprueba los datos!<br>"; }else{ echo "El directorio actual es: ",ftp_pwd($x),"<br>"; } # comprobamos el nombre del sistema operativo del servidor de FTP echo "El S.O: del servidor FTP es: ",ftp_systype ($x),"<br>"; /* obtenemos una matriz conteniendo la lista de ficheros y directorios del subdirectorio "Materiales" del del directorio actual*/ $lista=ftp_nlist($x,"Materiales"); # escribimos la lista de ficheros contenidos en ese directorio echo "Lista de ficheros contenidos en el subdirectorio Materiales<br>"; foreach ($lista as $valor){ echo $valor,"<br>"; } # obtenemos una lista completa de los contenidos de ese subdirectorio $lista=ftp_rawlist($x,"Materiales"); # ordenamos el array que contiene la lista anterior sort($lista); echo "Contenidos del subdirectorio Materiales<br>"; /* extrae los elementos del array eliminando los espacios repetidos mediante la funcion preg_replace en la que \s+ indica uno o más espacios que serán sustituidos por uno solo (' ') */ foreach($lista as $v){ $v=preg_replace('/\s+/', ' ', $v); # imprimimos la cadena completa print "<br><BR><BR>".$v."<br>"; # convertimos la cadena en un array # utilizando los espacios como separadores $extrae=explode(" ",$v); # leemos los elementos del array y comentamos sus valores foreach($extrae as $indice=>$cont){ switch($indice){ case 0: print "El elemento de indice".$indice." es: ".$cont."<br>"; if (substr($cont,0,1)=="d"){ print "Es un directorio<br>"; }elseif(substr($cont,0,1)=="-"){ print "Es un fichero<br>"; } if (substr($cont,1,1)=="r"){ print "Tiene permisos de LECTURA<br>"; }elseif(substr($cont,1,1)=="-"){ print "No tiene permisos de LECTURA<br>"; } if (substr($cont,2,1)=="w"){ print "Tiene permisos de ESCRITURA<br>"; }elseif(substr($cont,2,1)=="-"){ print "No tiene permisos de ESCRITURA<br>"; } break; case 4: print "El tamaño de este fichero es: ".$cont." bytes<br>"; break; case 8: print "El nombre del fichero o directorio es: ".$cont."<br>"; break; } } } /* creamos un subdirectorio (del directorio actual) con nombre experimento anteponiendo @# para evitar mensajes de error en caso de que ya existiera */ @ftp_mkdir($x,"experimento"); /* copiamos el fichero cabina.jpg desde el directorio que se indica en el tercer parámetro al directorio del servidor FTP que se indica en el segundo parámetro. Le ponemos por nombre calixto.jpg */ ftp_put($x, "/Apache/htdocs/experimento/calixto.jpg", "../Materiales/cabina.jpg",FTP_BINARY); # obtenemos el tamaño del fichero transferido echo "El tamaño de fichero tranferidos es: ", ftp_size($x,"/Apache/htdocs/experimento/calixto.jpg")," bytes<br>"; /* escribimos la fecha de la última modificación del fichero transferido que coincidirá con la fecha y hora en la que se realizó la transferencia. Convertimos a formato de fecha convencional el tiempo UNIX que devuelve la función ftp_mdtm */ print "La fecha de modificacion del fichero es:"; print date("d-m-Y H:i:s", ftp_mdtm($x,"/Apache/htdocs/experimento/calixto.jpg")); # cambiamos el nombre del fichero calixto.jpg por filiberto.jpg # en el servidor FTP @ftp_rename($x,"/Apache/htdocs/experimento/calixto.jpg", "/Apache/htdocs/experimento/filiberto.jpg"); /* creamos un enlace de descarga directa del fichero haciendo una llamada mediante el protocolo ftp:// utilizando la sintaxis: ftp://usuario:contraseña@nombre del servidor seguidos de la ruta (en el servidor FTP) y el nombre del fichero */ print "<BR><A href='ftp://admin:admin@localhost"; print "/Apache/htdocs/experimento/filiberto.jpg'> Descargar</a>"; /* transferimos al directorio del servidor Apache indicado en el segundo parámetro (con el nombre que se indica en el mismo) un fichero procedente del servidor FTP cuyo nombre y ruta se indican en el tercer parámetro*/ ftp_get($x,"../Materiales/tiburcio.jpg", "/Apache/htdocs/experimento/filiberto.jpg",FTP_ASCII); /* comprimimos un fichero alojado en el servidor Apache para transferirlo comprimido al servidor FTP */ #empezamos leyendo el fichero y guardándolo en una cadena $f1=fopen("../Materiales/cabina.jpg","r"); while (!feof($f1)) { $cadena .= fgets($f1,1024); } fclose($f1); # comprimimos la cadena obtenida del fichero anterior $c1=gzencode($cadena,3,FORCE_GZIP); # guardamos la cadena comprimida en un fichero $f=fopen("cabina.jpg.gz","w"); fwrite($f,$c1); fclose($f); /* al servidor el fichero comprimido. No es necesario indicar la ruta actual ya que ha sido creado en el mismo directorio en el que se está ejecutando el script */ ftp_put($x, "/Apache/htdocs/experimento/cabina.jpg.gz", "cabina.jpg.gz",FTP_BINARY); #eliminamos el fichero comprimido del servidor Apache unlink("cabina.jpg.gz"); # cerramos la conexión con el servidor ftp ftp_quit($x); # establecemos un enlace de descarga para el fichero comprimido print "<BR><A href='ftp://admin:admin@localhost"; print "/Apache/htdocs/experimento/cabina.jpg.gz'>Descarga comprimido</a>"; ?>
Transferencia desde el ordenador local al servidor FTP
Los procesos de transferencia que hemos visto en el ejemplo anterior se realizan siempre desde el servidor HTTP hacia el servidor FTP ó viceversa.| Ver código fuente |