banner-como-subir-descargar-archivos-por-ftp-laravel

El  protocolo de transferencia FTP  (por su siglas en inglés de File Transfer Protocol) es utilizado para transferencia de archivos en una red TCP (siglas en inglés Transmission Control Protocol), es decir, es un protocolo basado en la arquitectura cliente-servidor con el cual un cliente puede conectarse a un determinado servidor para subir o descargar un archivo deseado. En este post quiero mostrar cómo podemos hacer esto en Laravel.

Lo primero que vamos hacer es la instalación del plugin anchu/ftp. Para ello vamos a agregar el paquete al archivo composer.json:

"anchu/ftp": "~2.0"

y corremos en consola el comando:

composer update

Cuando se termine de descargar, agregamos el  service provider en array de providers que podemos encontrar en el archivo config/app.php:

Anchu\Ftp\FtpServiceProvider::class,

Por último en consola ejecutamos el siguiente código, para generar el archivo de configuración del plugin:

php artisan vendor:publish

Perfecto, ahora vamos a configurar nuestro plugin, para ello abrimos el archivo config/ftp.php y modificamos las propiedades hostusername, password:

'connections' => array(

        'mi_conexion1' => array(
            'host'   => 'nombre_del_host_a_conectar',
            'port'  => 21,
            'username' => 'tu_usuario',
            'password'   => 'tu_password',
            'passive'   => false,
        ),
    ),

Nota: puedes crear varias configuraciones para distintas conexiones, cambiando el nombre «mi_conexion1».

Muy bien, ya tenemos configurada nuestra conexión, para efectos de este ejemplo vamos a suponer que queremos subir un archivo que previamente fue cargado o generado en la carpeta storage/app/  el cual llamaremos indexFTP.html

Nota: debes de crear manualmente en el editor el archivo llamado indexFTP.html en storage/app/  

Por otro lado vamos a necesitar un controlador y su respectiva ruta. para ello vamos a ejecutar en la consola:

php artisan make:controller FtpController

y agregamos la ruta a la función index en el archivo de rutas app/Http/routes.php:

Route::get('/ftp', ['as ' => 'ftp', 'uses' => 'FtpController@index']);

Para subir archivos

Vamos a modificar el controlador para que realice la conexión y suba el archivo al servidor:

    public function index()
    {
        //Direccion local del archivo que queremos subir
        $fileLocal = storage_path('app/indexFTP.html');

        /*Direccion remota donde queremos subir el archivo
        En este caso seria a la raiz del servidor*/
       
        $fileRemote = '/indexFTP.html';

        $mode = 'FTP_BINARY';

        //Hacemos el upload
        \FTP::connection()->uploadFile($fileLocal,$fileRemote,$mode);

        //Detenemos la funcion con un mensajes
        return('Operación realizada con éxito');
    }

Excelente, ahora puedes ir a la ruta_de_tu_proyecto/ftp  y verás la notificación de que se realizó el proceso correctamente:

Podrás verificar que el archivo fue cargado a tu servidor con cualquier cliente FTP, como lo es el FileZilla.

archivoEnFTP

Para descargar el archivo del servidor

Vamos a modificar el controlador para que realice la conexión y descargue el archivo del servidor a nuestra carpeta storage/app:

    public function index()
    {
        //Direccion local del archivo que queremos subir

        $fileLocal = storage_path('app/indexFTPdownloaded.html');

        /*Direccion remota donde queremos subir el archivo
        En este caso seria a la raiz del servidor*/

        $fileRemote = '/indexFTP.html';

        $mode = 'FTP_BINARY';

        //Hacemos el download
        \FTP::connection()->downloadFile($fileRemote,$fileLocal,$mode);

        //Detenemos la funcion con un mensajes
        return('Operación realizada con éxito');
    }

Nota: lo vamos a descargar y guardar con el nombre indexFTPdownloaded.html para no confundirlo con el otro archivo.

De nuevo puedes ir a la ruta_de_tu_proyecto/ftp  y verás una vez más la notificación de que se realizó el proceso correctamente. En este caso puedes verificar en tu editor de texto que fue descargado correctamente el archivo.

archivoFTPdownloaded

En la página oficial del plugin, pueden encontrar otras funciones interesantes como:

  • makeDir($directory)   –  Crear directorios
  • getDirListing(); –  Listar contenido de un directorio
  • removeDir($directory, $recursive) – Eliminar directorios
  • Entre otros.

Espero que les haga gustado y les sea útil, considero que el protocolo de FTP es útil haciendo respaldos y también para el movimiento de archivos grandes.  Recuerda compartir ésta y demás lecciones en las redes sociales. Dudas y comentarios serán bien recibidos.

Enlaces recomendados

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Generar datos de prueba para Laravel con Styde Seeder Lección siguiente Cómo instalar filp/whoops en Laravel 5.*