Matriz de integración de tecnologías- Paola Carvajal.docx
57 Php. Funciones Ftp
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. 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. 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. 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