Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Cómo Trabajar con PHP y FTP

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Luis Chiabrera (you can also view the original English article)

En este tutorial, nuestro objetivo es crear una clase de FTP con PHP que esté bien escrita, sea útil y se pueda expandir.

Esbozando nuestro Objetivo

Siempre es importante en primer lugar describir exactamente qué funcionalidad debe incluir su clase. En nuestro caso:

  • conectándose a un servidor
  • crear una carpeta en el servidor
  • subir un archivo
  • cambiar directorio
  • recuperando el listado de directorios
  • descargar un archivo

¿Cuándo Utilizaría una Clase de FTP?

Hay varias instancias en las que uno podría usar este tipo de clase. Un par de escenarios podrían ser:

  • Automatice la carga de imágenes, como una galería, al sitio web de un cliente (idealmente, junto con mi tutorial para cambiar el tamaño de imagen)
  • Realice copias de seguridad externas al transferir un archivo de copia de seguridad de la base de datos de su servidor a otro. (Nota: esto no se recomienda para información confidencial, ya que FTP no es un protocolo muy seguro).

Nota: Es fácil tener problemas con FTP debido a las diferentes configuraciones del servidor. Este código ha sido probado con éxito en varios servidores FTP.


¿Qué es FTP?

FTP: "Un protocolo de red estándar utilizado para copiar un archivo de un host a otro".

FTP, o Protocolo de transferencia de archivos, es, como lo define Wikipedia: "Un protocolo de red estándar utilizado para copiar un archivo de un host a otro a través de una red basada en TCP / IP, como Internet".

Esencialmente, te permite copiar un archivo (s) de una computadora a otra.


Paso 1 - Preparación

Empezaremos lo más fácil posible. En la raíz de su nuevo proyecto, cree dos archivos: index.php y ftp_class.php.

El archivo index.php es nuestra página principal que crea el objeto y llama a los métodos necesarios. El ftp_class.php es solo eso: nuestra clase ftp.

En el siguiente paso, vamos a crear el esqueleto para nuestra clase. Una vez que esté en su lugar, podrás seguir y probar cada paso.


Paso 2 - Configuración de la Clase

La fuerza de la programación orientada a objetos (OOP, por sus siglas en inglés) es proporcionar a los códigos complejos una interfaz fácil de usar. Al crear una clase (piensa en una clase como un patrón) puede encapsular los datos, lo cual es simplemente una jerga para un término que se refiere a ocultar los datos. Podemos reutilizar esta clase una y otra vez sin la necesidad de volver a escribir ninguno de los códigos. En su lugar, solo necesita llamar a los métodos apropiados (el término "método" es el mismo que la función).

Vamos a empezar a crear nuestra clase ftp. Abre tu archivo ftp_class.php y agrega el siguiente código. Esta es una estructura de esqueleto de clase básica, que he llamado 'FTPClient'.

La función de construct, conocida como constructor, es un método de clase especial al que la clase llama automáticamente cuando creas un nuevo objeto o instancia de la clase. Este suele ser un buen lugar para agregar algo de inicialización; Pero para el propósito de hoy, no lo necesitamos. No obstante, lo mantendremos aquí para uso futuro.

Tenga en cuenta que estamos usando un doble guión bajo para ese método de construct.


Paso 3 - Variables de Clase

A continuación, estableceremos algunas variables de clase, o propiedades.

El prefijo "privado" define el alcance de la variable. En este caso, significa que no se puede acceder a la variable desde cualquier lugar fuera de la clase.

La variable $connectionId almacenará nuestro flujo de conexión. Los otros dos almacenan el estado y cualquier mensaje. $loginOk será útil para determinar si estamos conectados correctamente.


Paso 4 - Registro de Mensajes Simple

En casi todos los métodos, llamaremos un método llamado 'logMessage'. Este es un manejador de mensajes muy básico, que nos permitirá capturar cualquier mensaje creado por nuestra clase para que podamos proporcionar comentarios al usuario.

Ten en cuenta que no hacemos return los mensajes reales desde nuestros métodos. En cambio, devolvemos true o false, según si una operación en particular fue exitosa o no. Esto tiene sus ventajas, pero tampoco detalla al usuario lo que está sucediendo.

Agregue los siguientes dos métodos, para que podamos determinar cuál es el éxito.

Este método acepta una variable, $mensaje. Los contenidos de esta variable se guardan en nuestra matriz de clases, gracias a la línea: $this->messageArray[] = $message;

Como $messageArray es una variable de clase, podemos acceder a ella a través de la notación $this->.

Dentro de una clase, $this se refiere al objeto en sí.

Para recuperar el mensaje, llamamos a getMessages.

Este método es un método público. Como se mencionó anteriormente, este negocio privado / público simplemente se refiere al alcance de la variable, o en este caso, al método. No se puede acceder a un método privado (o variable) fuera de la clase, mientras que un método público (o variable) puede accederse.

Debido a que nuestra variable es privada, necesitamos una forma de acceder a ella. Hacemos esto dando a nuestra clase un método public, al cual podemos acceder fuera de la clase. Podrías preguntarte por qué no podemos simplemente hacer pública la variable messageArray. Podemos; Dicho esto, simplemente no es una buena práctica.

Nota: hay muchos ejemplos en la web de controladores de mensajes completos o clases dedicadas a ellos. Estamos trabajando en una implementación simple para los fines de este tutorial.


Paso 5 - Conectando

En este paso, agregaremos el método de connect. Esto nos permitirá conectarnos a un servidor FTP.

Pasamos nuestra información de conexión: el servidor ($server), el nombre de usuario ($ftpUser) y la contraseña ($ftpPassword) para permitirnos establecer una conexión.

La primera línea de código abre una conexión FTP, con ftp_connect, al servidor especificado. Guardamos nuestra conexión a la variable de clase, $connectionId descrita anteriormente.

El código, ftp_login, nos registra en la conexión especificada, pasando nuestra connection id, nuestro nombre de usuario y contraseña.

Es posible que hayas notado la línea de código ftp_pasv. Esto, como implica el comentario, activa / desactiva el modo pasivo. Te sugeriría que lo dejes, sin embargo, si tienes algún problema para conectarte, intenta encenderlo. El modo pasivo puede causar un poco de yegua cuando se conecta a través de FTP.

Determinamos si la conexión fue exitosa. Luego, registramos los resultados llamando a nuestro método simple de manejo de mensajes, logMessage (), y pasamos la cadena a registrar. Recuerde: usamos $this-> para acceder a logMessage (), ya que es una variable de clase.


Paso 6 - Llamando al Objeto

¡Ahora que nuestra clase está trabajando, podemos probarlo! Abra su archivo index.php y agregue el siguiente código.

Necesitarás acceso a un servidor FTP para jugar. Si desea configurar su propio servidor, pruebe Filezilla, también es gratis.

Notarás que he agregado los detalles del servidor FTP aquí. Idealmente, estos serían almacenados dentro de tu archivo de config. Cámbialos para que coincidan con la configuración de tu servidor FTP.

Después de definir los detalles de nuestro servidor FTP, incluimos la clase con include ('ftp_class.php') ;. Esto significa: hacer que la clase esté disponible desde esta página. La siguiente línea crea un objeto de nuestra clase de FTP y lo almacena en la variable, $ftpObj. $ftpObj ahora se utilizará para acceder a cualquier método público dentro de nuestra clase. Esto se hace usando la notación ->, tal como lo hace la siguiente línea llamando al método $ftpObj -> connect y pasándole los detalles de nuestro servidor.

Como puede ver, una vez que nuestra clase está en su lugar, ¡conectarse a nuestro servidor FTP es realmente muy fácil!


Paso 6b - Viendo la salida

En el último paso podríamos ajustar la llamada de conexión en una sentencia if, como se muestra a continuación. Entonces, si no nos conectamos, el código dependiente no se ejecutará. Luego podemos enviar cualquier mensaje al usuario, como "conectado" o "fallido".

Esto está bien, aunque nuestro código se hinchará rápidamente con las declaraciones IF / ELSE, si agregamos esto a todas nuestras llamadas. En su lugar, me gustaría ofrecer una alternativa que haga las cosas un poco más limpias y más fáciles de seguir.

¿Recuerdas los métodos de manejo de mensajes que agregamos? Si deseas ver los mensajes producidos por la clase, útil para la depuración / retroalimentación, puedes agregar el siguiente código después de cualquier método al que llames.

Esto mostrará el mensaje de la clase.


Paso 7 - Haciendo nuestro Primer Directorio

Excelente, ahora es el momento de hacer algo útil. El primer método que vamos a crear es el método makeDir. Como se esperaba, este método creará directorios para nosotros en el servidor. El único parámetro que pasaremos es la ruta del directorio y el nombre de la carpeta; lo llamaremos $directory. La línea mágica aquí es la función incorporada ftp_mkdir. Utiliza nuestro "connectionId" guardado y la variable de $directory aprobada para crear la carpeta.

Agregue el siguiente código a su archivo ftp_class.php:

Y, para llamarlo desde su archivo index.php, agregue:

La variable, $dir se establece en el nombre de la carpeta que queremos crear en el servidor. En este caso: "fotos".

La siguiente línea llama al método que creará la carpeta.

Si recibes un error de "Permiso denegado", asegúrate de que puedes escribir en la carpeta especificada. Es posible que debas crear la carpeta dentro de un directorio, como /httpdocs.


Paso 8 - Cargar un Archivo

Continuando, subamos una foto, llamada zoe.jpg. Al cargar un archivo, debemos especificar qué tipo de archivo estamos cargando: binary o ascii? Básicamente, si estás cargando un archivo de texto, deberíamos usar ascii; De lo contrario, se debe establecer en binario.

Comenzamos configurando una array con todas las extensiones que deberíamos usar para una carga de tipo ascii.

Luego, recuperamos la extensión de nuestro archivo, para que podamos probar si es uno de los tipos ascii. Determinamos esto obteniendo la extensión del archivo que estamos cargando. El método rápido y sucio que he usado aquí es "explotando" el archivo usando el '.' como el delimitador. Esto dividirá el archivo en partes y los almacenará como una array. Usando otra función PHP incorporada, "end", seleccionamos el último elemento de la array que contiene nuestra extensión. Es un poco de código ordenado.

A continuación, probamos si nuestra extensión aparece en la lista (con in_array) de las extensiones de archivo que deben cargarse como tipo ascii. Si aparece en la lista, configuramos la variable $mode en FTP_ASCII; de lo contrario, asumimos que es de tipo binario y asignamos a $mode el valor FTP_BINARY.

ftp_put carga un archivo desde tu ubicación local a un archivo remoto en el servidor ftp. Le pasamos nuestro "connectionId", la ruta al archivo que queremos cargar ($fileTo), la ruta del archivo que queremos cargar ($file From), y el modo ($mode) que acabamos de determinar.

A continuación, agrega el siguiente método a tu archivo ftp_class.php:

¡Ciertamente, puedes crear o subir cualquier nombre de carpeta que desees! Agrega este siguiente fragmento de código a tu archivo index.php y ajústalo en consecuencia.

En este momento, ¡deberías estar llegando a un acuerdo con lo fácil que es usar esta clase! Simplemente hacemos llamadas individuales para realizar nuestras tareas, ¡todo gracias a la programación orientada a objetos!


Paso 9 - Viendo los Archivos

Ahora confirmemos que nuestro archivo está en la carpeta de photo. Podemos hacerlo navegando a la carpeta 'photo' en nuestro servidor, y luego mostrar el contenido.

El método changeDir usa "ftp_chdir" para cambiar el directorio actual en el servidor ftp. Simplemente pase el directorio para cambiar a. Sencilla y dulce.

ftp_class.php:

getDirListing mostrará el contenido del directorio en el que se encuentra utilizando la función "ftp_nlist". Esta función devuelve una lista de archivos en un directorio dado. El directorio actual está configurado de forma predeterminada, por lo que no es necesario que proporciones ningún parámetro.

Si lo desea, puede anular esto pasando la ruta del $directory en la que desea ver el contenido. La variable $parameters por defecto es '-la'. Este es un comando de Linux para mostrar más información sobre el directorio. Siéntete libre de eliminarlo o pasar una cadena vacía.

ftp_class.php:

El método getDirListing devuelve una array que contiene nuestra lista de directorios.

index.php

';

Tu resultado debería verse así:


Paso 10 - Descarga de un Archivo

A medida que avanzamos hacia la conclusión de este tutorial, pasamos a la descarga del archivo. El método comienza con el mismo código que uploadFile, ya que determina si el archivo que queremos descargar es ascii o binary.

Para este método, simplemente pase el nombre del archivo (y posiblemente la ruta, dependiendo de si está en la misma carpeta que el archivo que desea descargar) del archivo que desea descargar, y el nombre que desea que tenga ese archivo en la carpeta. Su máquina cliente.

Para descargar un archivo, necesitas llamar a ftp_get.

Esto descarga un archivo desde un servidor remoto a nuestra máquina local. Acepta el siguiente parámetro: nuestro ID de conexión, la ruta y el nombre de archivo para guardar como localmente (se sobrescribirá si ya existe) ($fileTo), la ubicación y el nombre del archivo en el servidor remoto ($fileFrom), y el modo ($mode).

ftp_class.php

Vamos a descargar el mismo archivo que cargamos guardándolo con un nombre diferente en la máquina de nuestro cliente.

Nota: ¡De nuevo, asegúrese de que sus permisos estén configurados correctamente!

Como ahora deberíamos estar dentro de nuestra carpeta de photo, no agregamos una ruta a la variable $fileFrom, solo el nombre del archivo.

index.php

Paso 11 - Terminando

Para completar nuestra clase, agreguemos el método de magia de clase, __deconstruct. Este método cierra nuestra conexión cuando ya no existe la referencia a nuestro objeto, tal vez la página se cerró. En cualquier caso, este código se ejecuta y la conexión se cierra. Siempre es una buena práctica incluir esto, aunque no es del todo necesario.


Conclusión

Bueno, eso lo hace! Espero que ahora tengas una mejor comprensión de cómo usar FTP con PHP. Ahora debes tener las habilidades necesarias para expandir aún más esta clase para admitir otras tareas comunes, como cambiar el nombre o eliminar archivos y carpetas.

¡Asegúrate de informarnos si creas clientes PHP FTP geniales!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.