57 Php. Funciones Ftp

1,163 views
1,101 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,163
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
28
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

57 Php. Funciones Ftp

  1. 1. Funciones FTP Dos tipos de transferencias Requisitos del sistema En la página anterior hemos hablado de la manera de transferir El uso de estas funciones requiere que PHP tenga activada la opción FTP (enabled), que información entre el ordenador de en nuestro caso está activada en la configuración por defecto, tal como puedes ver a través un usuario y un servidor web. de tu info.php, que tendrá un apartado idéntico al que observamos en la siguiente imagen. Aquí trataremos algo –similar a primera vista– un poco distinto. Es el caso las transferencias –en los dos sentidos– entre servidores (un servidor HTTP y un servidor FTP). Esto en cuanto a PHP. Pero además de esta configuración será imprescindible disponer de un servidor FTP accesible y activo. En este tipo de transferencias intervienen dos En la configuración descrita en la servidores: el servidor HTTP (nuestro Apache) y el servidor FTP, cuyo procedimiento de instalación del servidor FTP hemos instalación y configuración hemos descrito en el apartado Servidor de FTP. Antes de poder establecido que ambos servidores utilizar las funciones que aquí describimos deberás tener instalado y activo el servidor FTP tengan por root el mismo que allí se describe. directorio, pero no es la única opción posible. Nos conviene recordar que en la configuración allí descrita el servidor se llama: Es totalmente factible que uno de localhost; y que hemos creado diferentes usuarios (con privilegios distintos) entre ellos los servidores esté alojado en un admin. hosting de Londres y el otro en Sydney, por poner un ejemplo de Comprobación de login y conexión lugares distantes. Imaginemos que todo esto es <? cierto. # conexión con el servidor FTP if($x=@ftp_connect ("localhost",21)){ echo "Conexión FTP activada<br>"; Transferencias FTP }else{ echo "No se activo lo conexión FTP<br>"; Los dos primeros pasos para poder } utilizar las funciones FTP han de # registro de usuario ser: abrir la conexión y pasar el if(@ftp_login($x,"admin","admin")){ login. El último sería cerrar la conexión. echo "El login y la password han sido aceptados"; }else{ echo "Error en login o password"; Abrir la conexión } #desconexión $x=ftp_connect (host,pt) ftp_quit($x); ?> Esta función –en la que host es una cadena con el nombre del servidor FTP (no te olvides de ponerlo entre comillas) y pt es el ejemplo91.php número del puerto a través del cual se efectúa la conexión FTP– abre una conexión con el servidor Lista de contenidos del subdirectorio Apache FTP. Si se omite pt se asigna por <? defecto el valor 21 que es el if($x=@ftp_connect ("localhost",21)){ puerto que se usa habitual- mente echo "Conexión FTP activada<br>"; para acceder a este tipo de }else{ servidores. echo "No se activo lo conexión FTP"; } La variable $x recogerá el identificador de conexión que if(@ftp_login($x,"admin","admin")){ será utilizado por las demás echo "El login y la password han sido aceptados<BR><BR>"; funciones. }else{ echo "Error en login o password"; } «Loguearse» $lista=ftp_nlist($x,"/Apache"); foreach($lista as $c=>$v){ Utilizaremos este término del argot print "Indice: ".$c." Valor: ".$v."<br>"; informático –¿horrible, verdad?– } para referirnos al hecho de que el print "<H1>Lista completa</H1>"; usuario se acredite como $listacompleta=ftp_rawlist($x,"/"); autorizado en el servidor FTP. foreach($listacompleta as $c=>$v){ ftp_login($x,user,pass) print "Indice: ".$c." Valor: <H1>".$v."</H1>"; } Una vez abierta la conexión es ftp_quit($x); preciso comenzar la sesión ?> utilizando la función ftp_login con los siguientes parámetros: ejemplo92.php • $x, que es la variable en la que se recogía el resultado de ftp_connect. El resultado de la ejecución del script anterior podría producir una salida similar a esta: • user, que es el nombre de usuario. • pass, que es la password del usuario. Esta función devuelve un valor booleano que será 1 en el caso en que se inicie la sesión correctamente o NUL si no lo hace.
  2. 2. Cerrar la conexión Mediante la función: ftp_quit($x) se cierra la conexión abierta con el identificador indicado en la variable $x. Gestión de directorios en el servidor FTP Una vez logueados y con la conexión activa ya podremos utilizar funciones FTP tales como: ftp_cdup($x) Tal como puedes ver en la imagen, la cadena devuelta por la función ftp_rawlist tiene dos resultados distintos. La primera de las cadenas comienza por – lo cual indica que se trata de Nos situa en el directorio raíz del un archivo y documento. En el segundo de los casos ese primer carácter es d e indica que servidor FTP. se trata de un directorio. ftp_pwd($x) Los nueve caracteres siguientes especifican los permisos de acceso a los ficheros y/o directorios. Se subdividen en tres bloques de igual tamaño que corresponden a los tres Nos devuelve una cadena con el niveles de usuarios habituales en sistemas Unix/Linux (propietario, grupo y resto de nombre del directorio actual. usuarios). Para nuestros propósitos bastará con que consideremos los privilegios del primer bloque, es decir los del propietario. ftp_chdir($x, nuevodir) El primero carácter de cada bloque sólo puede ser r ó –. Si se trata de un fichero y está Cambia el acceso actual al marcado con r indica que se permite el acceso a él en modo lectura y si se trata de un directorio especificado por la directorio indica que está permitida la visualización de su contenido. cadena nuevodir, en caso de que El segundo de los caracteres (puede ser w ó –) indica, si se trata de un fichero, que está exista. permitida la modificación del fichero. Cuando se trata de un directorio significa que se pueden añadir o suprimir ficheros. ftp_pwd($x) El tercero de los caracteres indicaría (x ó –) que el fichero -si se trata de un ejecutable- Indica el nombre del directorio al tiene permisos para ser ejecutado. Cuando se trata de un directorio, indica que pueden que estamos accediendo en este conocerse los atributos de los ficheros que contiene y que está permitido el acceso a él y a momento. sus subdirectorios. El signo – significa la negación del atributo en todas las opciones. ftp_mkdir($x, nomdir) El siguiente carácter, el número 1, está asociado con sistemas Linux/Unix e indicaría el número de vínculos duros contra el archivo, que es otra cosa que una forma de asignar Crea un subdirectorio –en el directorio actual– cuyo nombre es nombres distintos a un mismo fichero. el nombre indicado en la cadena Los dos grupos siguientes -parece que no demasiado relevantes para nuestros nomdir. propósitos- ser los nombres del usuario y grupo al que pertenece. A continuación aparece el tamaño del archivo (cero si se trata de un directorio), la fecha ftp_rmdir($x, nomdir) y hora de su creación y el nombre del archivo o directorio. Borra el directorio especificado en la cadena nomdir. Una miscelánea de las funciones FTP Para que un directorio pueda ser borrado se requiere que esté <? vacío y que esté incluido dentro # Conexión con el el servidor ftp del directorio actual. if(!$x=@ftp_connect ("localhost",21)){ echo "No se activo lo conexión FTP"; exit(); Información sobre los } contenidos de los # Identificación de usuario directorios if(!@ftp_login($x,"admin","admin")){ del servidor FTP echo "Error en login o password"; exit(); ftp_nlist($x, nomdir) } /* comprobamos el nombre del directorio actual del servidor FTP Devuelve una array escalar con los que será el root correspondiente al usuario registrado */ nombres de los ficheros y echo "El directorio actual es: ",ftp_pwd($x),"<br>"; subdirectorios contenidos en el directorio que se indica en nomdir. /* intentamos cambiar a un subdirectorio indicando la ruta absoluta partiendo del directorio root del usuario actual. Si se trata del directorio actual, el En caso de error (ruta incorrecta o falta de permisos de accesos parámetro nomdir puede nos daría un mensaje de error. Si el cambio tiene éxito nos indicaría especificarse como una cadena el nombre del nuevo directorio */ vacia (""). if(!@ftp_chdir($x,"/Apache/htdocs")){ print "No tienes permisos de acceso a este directorio<br>"; Si la información se refiere a un subdirectorio del actual bastará print "o la ruta es incorrecta.¡Comprueba los datos!<br>"; poner su nombre como valor del }else{ parámetro nomdir. echo "Hemos cambiado al directorio: ",ftp_pwd($x),"<br>"; } En cualquier otro caso nomdir # comprobamos el nombre del sistema operativo del servidor de FTP contendrá la ruta completa. echo "El S.O: del servidor FTP es: ",ftp_systype ($x),"<br>"; /* obtenemos una matriz conteniendo la lista de ficheros y directorios ftp_rawlist($x, nomdir) del subdirectorio "cursoPHP/images" del del directorio actual*/ Igual que la función anterior, $lista=ftp_nlist($x,"cursoPHP/images"); ftp_rawlist también devuelve un # escribimos la lista de ficheros contenidos en ese directorio array escalar, pero en este caso echo "Lista de ficheros contenidos en el subdirectorio cursoPHP/ con información ampliada. images<br>"; foreach ($lista as $valor){ Este array detalla, además del echo $valor,"<br>"; nombre del fichero, el tamaño, el } tipo, la fecha de la última modificación y los permisos de # obtenemos una lista completa de los contenidos de ese subdirectorio lectura y/o escritura. $lista=ftp_rawlist($x,"cursoPHP/images"); # ordenamos el array que contiene la lista anterior sort($lista); Transferencia de ficheros echo "Contenidos del subdirectorio cursoPHP/images<br>"; /* extrae los elementos del array eliminando los espacios repetidos Las transferencias de ficheros
  3. 3. mediante la funcion preg_replace en la que s+ indica uno o más espacios pueden realizarse en ambos que serán sustituidos por uno solo (' ') */ sentidos. foreach($lista as $v){ Desde el servidor FTP $v=preg_replace('/s+/', ' ', $v); hasta el servidor HTTP # imprimimos la cadena completa print "<br><BR><BR>".$v."<br>"; Mediante la función: # convertimos la cadena en un array # utilizando los espacios como separadores ftp_get($x,nloc,nrem,modo) $extrae=explode(" ",$v); se transfiere un fichero desde un # leemos los elementos del array y comentamos sus valores servidor FTP hasta un directorio foreach($extrae as $indice=>$cont){ del servidor HTTP en el que se está switch($indice){ ejecutando PHP. case 0: print "El elemento de indice".$indice." es: ".$cont."<br>"; La cadena nloc contiene el nombre if (substr($cont,0,1)=="d"){ con el que el fichero será copiado print "Es un directorio<br>"; en el directorio actual del servidor }elseif(substr($cont,0,1)=="-"){ web y la cadena nrem contiene el nombre (incluyendo el path) del print "Es un fichero<br>"; fichero que debe ser trasferido. } if (substr($cont,1,1)=="r"){ El parámetro modo puede print "Tiene permisos de LECTURA<br>"; contener uno de estos valores: }elseif(substr($cont,1,1)=="-"){ FTP_ASCII o FTP_BINARY print "No tiene permisos de LECTURA<br>"; } Desde el servidor HTTP hasta el servidor FTP if (substr($cont,2,1)=="w"){ print "Tiene permisos de ESCRITURA<br>"; Para realizar transferencias en }elseif(substr($cont,2,1)=="-"){ sentido contrario al anterior se print "No tiene permisos de ESCRITURA<br>"; utiliza la siguiente sintaxis: } break; ftp_put($x,nrem,nloc,modo) case 4: Se comporta de forma idéntica a la print "El tamaño de este fichero es: ".$cont." bytes<br>"; función anterior. La cadena nrem break; sigue siendo el nombre y el path case 8: del servidor FTP (donde vamos a print "El nombre del fichero o directorio es: ".$cont."<br>"; copiar el fichero) y nloc contiene break; el nombre del fichero en el } servidor web (origen de la } transferencia). } /* creamos un subdirectorio (del directorio actual) Modificación de ficheros con nombre experimento anteponiendo @# para evitar mensajes de error en el servidor FTP en caso de que ya existiera */ @ftp_mkdir($x,"experimento"); ftp_rename($x,nant,nnuevo) /* copiamos el fichero enol.jpg desde el directorio que se indica en el tercer parámetro (dentro servidor Apache) Cambia el nombre del fichero nant al directorio del servidor FTP que se indica por el indicado en la cadena en el segundo parámetro. Le ponemos por nombre lago_enol.jpg */ nnuevo. ftp_put($x, "/Apache/htdocs/experimento/lago_enol.jpg", "../cursoPHP/enol.jpg",FTP_BINARY); ftp_delete($x,fichero) # obtenemos el tamaño del fichero transferido Elimina -en el servidor FTP- el echo "El tamaño de fichero tranferidos es: ", fichero indicado en la cadena ftp_size($x,"/Apache/htdocs/experimento/lago_enol.jpg")," bytes<br>"; fichero. /* 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 Información sobre la función ftp_mdtm */ ficheros del en el servidor print "La fecha de modificacion del fichero es:"; FTP print date("d-m-Y H:i:s", ftp_mdtm($x,"/Apache/htdocs/experimento/lago_enol.jpg")); ftp_size($x,nomfile) # cambiamos el nombre del fichero lago_enol.jpg por lago_covadonga.jpg # en el servidor FTP Devuelve el tamaño (en bytes) del @ftp_rename($x,"/Apache/htdocs/experimento/lago_enol.jpg", fichero que se indica en la cadena nomfile. "/Apache/htdocs/experimento/lago_covadonga.jpg"); /* creamos un enlace de descarga directa del fichero haciendo una llamada ftp_mdtm($x,nomfile) mediante el protocolo ftp:// utilizando la sintaxis: ftp://usuario:contraseña@nombre del servidor Esta función devuelve la fecha de seguidos de la ruta (en el servidor FTP) y el nombre del fichero */ la última modificación del fichero print "<BR><A href='ftp://admin:admin@localhost"; indicado en la cadena nomfile. Esta print "/Apache/htdocs/experimento/lago_covadonga.jpg'> Descargar</a>"; fecha se indica en tiempo Unix. /* transferimos al directorio del servidor Apache indicado en el segundo parámetro (con el nombre que se indica Ejercicio nº 31 en el mismo) un fichero procedente del servidor FTP cuyo nombre y ruta se indican en el tercer parámetro*/ Crea un formulario y un script ftp_get($x,"../cursoPHP/liborio.jpg", mediante los cuales puedas "/Apache/htdocs/experimento/lago_covadonga.jpg",FTP_ASCII); subir al directorio /* comprimimos un fichero alojado en el servidor Apache Documentacion del servidor para transferirlo comprimido al servidor FTP */ FTP un fichero cualquiera. #empezamos leyendo el fichero y guardándolo en una cadena $f1=fopen("../cursoPHP/cabina.jpg","r"); Utiliza el nombre de usuario while (!feof($f1)) { y contraseña adecuados $cadena .= fgets($f1,1024); para poder acceder al } directorio indicado y evita fclose($f1); que quede copia del fichero # comprimimos la cadena obtenida del fichero anterior en el servidor Apache. $c1=gzencode($cadena,3,FORCE_GZIP); # guardamos la cadena comprimida en un fichero Intenta mejorar el script para $f=fopen("cabina.jpg.gz","w"); limitar el tamaño del archivo fwrite($f,$c1); y restringir la transferencia a fclose($f); formatos *.jpg ó *.gif. /* al servidor el fichero comprimido. No es necesario indicar la ruta actual ya que ha sido creado en el mismo directorio
  4. 4. 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>"; ?> ejemplo93.php Anterior Indice Siguiente

×