Exportar ficheros a FTP Externo (Posibilidad de automatizar)

Dado que es un tema recurrente y no hay una solución nativa de Velneo, voy a aportar mi granito de arena.

Esta es mi solución para exportar ficheros a FTP, en concreto su es para actualizar Stocks de tiendas online pero serviría para actualizar componentes de una página web así como conectar aplicaciones permitiendo a los usuarios realizar tareas de actualización a través de su aplicación.

En primer lugar he creado un formulario en la configuración de empresa donde el usuario podrá rellenar los datos de acceso a ftp. Estos datos los almaceno en campos en la base de datos de empresa preparados para acceder a ellos.

Datos%20FTP

Ahora vamos a por el proceso:

En primer lugar recogemos los datos de acceso a FTP configurados por el cliente.

En mi caso, recojo los valores establecidos en la empresa principal del usuario y los almaceno en variables locales.

A continuación vamos a crear el .bat que usaremos para subir los ficheros al FTP.

Yo utilizo la cache del cliente para almacenar de forma temporal el fichero .bat que llamamos “upftp.bat”.

En Grabar línea, grabaremos el contenido que contendrá el .bat. con los comandos ftp para subir ficheros.

A continuación seguiremos con la creación del fichero .dat que contendrá los datos de acceso al ftp recolectados anteriormente.

En Grabar línea, grabaremos los datos de la siguiente forma:

** Punto importante a tener en cuenta será tener mucho cuidado con las rutas de los ficheros ya que hay cierta diferencia de cuando se ejecuta desde cmd (comandos del sistema) que cuando lo hacemos desde velneo. Desde velneo tendremos que tener en cuenta siempre la ruta también en la ejecución de comandos tal y como hago en el ejemplo.

Seguimos pasando los ficheros que queremos subir al ftp a la misma carpeta donde hemos creado estos ficheros, en mi caso, la cache del cliente. En este caso yo creé un csv sencillo que se rellena con algunos datos de los artículos. En caso de no usar un csv y usar cualquier otro tipo de fichero deberemos tenerlo en cuenta en la creación del fichero .dat.

Por último solo nos queda ejecutar el documento .bat.

Subir%20FTP%20-%20EXE

Listo, ya tenemos la subida a FTP. ¡Esta todo hecho!

Espero que les sirva de ayuda. Acepto cualquier optimización del código, una cerveza o algún error que se me haya escapado.

Un saludo,
David Ramallo.

5 Me gusta

Hola David,
Gracias por el aporte y en especial por el detalle de la explicación.

Cordial saludo,
Carlos Erazo

Gracias David por compartir. Se echan de menos este tipo de aportaciones

Hola David,

Muchas gracias por compartir esas preciadas líneas con tanto detalle.

Sé hecha de menos entradas como la tuya, y también aquellas Open Apps que antes estaban disponibles desde Velneo, con grandes ejemplos muy didácticos.

Saludos
Ramon Denuc :+1:

Gracias David por compartir.

1 me gusta

Hola David.

Buena aportación.

Yo no uso FTP desde hace años pero he desempolvado una rutina y propongo la siguiente modificación para tener información del resultado de la ejecución del comando FTP.

Para las pruebas he usado el servidor FTP de FileZilla.

Creamos un proceso PRO_FTP_SUBIR que nos permita encapsular todo el código para su uso en cualquier aplicación:

Rem ( Proceso PRO_FTP_SUBIR que ejecuta el comando FTP para subir al Servidor un archivo local )
Rem ( CFTP_SERVIDOR: IP o dirección del Servidor FTP )
Rem ( CFTP_USUARIO: Usuario con derechos de accesoi de escritura a la Subcarpeta )
Rem ( CFTP_PASSWORD: Contraseña de acceso )
Rem ( CFTP_SUBCARPETA: Carpeta donde se añade el archivo local )
Rem ( CARCHIVO_LOCAL: Path completo del archivo que se va a subir al servidor FTP )
Rem ( Archivo BAT que ejecutará VClient (No es necesario, usamos el comando MSDOS en su lugar) )
Set ( CARCHIVO_BAT, sysCacheClientPath + "_ftp_subir.bat" )
Rem ( Archivo de Texto con los comandos que ejecutará FTP de manera automática )
Set ( CARCHIVO_CMD, sysCacheClientPath + "_ftp_comandos.txt" )
Rem ( Archivo de Texto con el log de ejecución )
Set ( CFICHERO_LOG, sysCacheClientPath + "_ftp_resultado.txt" )
Libre
Rem ( Montamos un archivo de texto con los comandos FTP para el Login y el Envío del archivo )
Fichero: Abrir ( hFiche, CARCHIVO_CMD, Lectura/escritura (Crea o limpia), LOK, ISO-8859-1 )
  Fichero: Grabar línea ( hFiche, "user " + CFTP_USUARIO + "\n" + CFTP_PASSWORD + "\n" + "bin\n" + choose(isEmpty(CFTP_SUBCARPETA), "", "cd " + CFTP_SUBCARPETA)+ "\n" + "put " + CARCHIVO_LOCAL + "\n" + "quit" , LOK )
Libre
¿Existe fichero? ( CARCHIVO_CMD, LOK, )
If ( LOK = 0 )
  Set ( CERROR, "No se ha podido crear " + CARCHIVO_CMD + ".<br><br>Envío cancelado" )
  Set retorno proceso = NO
  Finalizar proceso
Libre
Rem ( Archivo para el LOG con los mensajes del Servidor )
Set ( CFTP_LOG, "" )
¿Existe fichero? ( CFICHERO_LOG, LOK, )
If ( LOK )
  Eliminar fichero de disco ( CFICHERO_LOG, LOK )
Libre
Rem ( Ejecutar el comando de sistema en lugar del .bat nos permite ejecución síncrona y esperar el resultado )
Rem ( Parámetro -n para evitar Login automático. -s para ejecutar los comandos del archivo de texto )
Set ( CFTP_COMANDO, "ftp -n -s:" + CARCHIVO_CMD + " " + CFTP_SERVIDOR + " >" + CFICHERO_LOG )
Libre
Ejecutar comando del sistema ( CFTP_COMANDO, NRESUL )
Libre
Rem ( El comando ftp siempre devolverá 0. Se devuelve 1 en el caso de que el comando no esté bien escrito)
If ( NRESUL = 0 )
  Set ( CRESULTADO, "OK - Comando FTP ejecutado" )
  ¿Existe fichero? ( CFICHERO_LOG, LOK, )
  If ( LOK )
    Rem ( Hay una serie de Códigos de respuesta. )
    Rem ( 530 - Login o Password incorrecta )
    Rem ( 550 - La carpeta remota no existe o no tiene permiso de escritura )
    Rem ( 226 - Transferencia correcta )
    Fichero: Abrir ( hResul, CFICHERO_LOG, Solo lectura, LOK, .Ninguno )
    Set ( LOK, 1 )
    For ( NLIN, 1, LOK, 1 )
      Fichero: Leer línea ( hResul, CLINEA, LOK )
      Set ( CFTP_LOG, CFTP_LOG + CLINEA + "\n" )
    Rem ( Comprobamos el resultado )
    If ( indexOfRegExp(CFTP_LOG, "\n530 ", 0, 0) > -1 )
      Set ( CRESULTADO, "FALLO - Usuario o contraseña incorrectos" )
    Else if ( indexOfRegExp(CFTP_LOG, "\n550 ", 0, 0) > -1 )
      Set ( CRESULTADO, "FALLO - No existe la carpeta remota o no tiene permiso de escritura" )
    Else if ( indexOfRegExp(CFTP_LOG, "\n226 ", 0, 0) > -1 )
      Set ( CRESULTADO, "OK - Transferencia correcta" )
    Else
      Set ( CRESULTADO, "FALLO - Causa desconocida" )
    Set ( CRESULTADO, CRESULTADO + choose(LVER_LOG, "\n\n" + CFTP_LOG, "") )
Else
  Set ( CERROR, "Ha habido un problema con el <b>comando ftp</b>" )
  Set retorno proceso = NO
  Finalizar proceso
Libre

Desde un Manejador ejecutamos el proceso de la siguiente manera:

Rem ( Envío de archivo al Servidor FTP )
Set ( CARCHIVO_LOCAL, choose(isEmpty(CARCHIVO_LOCAL), "none", CARCHIVO_LOCAL) )
¿Existe fichero? ( CARCHIVO_LOCAL, LOK, )
If ( LOK = 0 )
  Set ( CRESULTADO, "NO existe el archivo local: " + CARCHIVO_LOCAL )
  Finalizar proceso
Libre
Crear manejador de objeto ( hFTP, Proceso PRO_FTP_SUBIR@proyecto_app )
Set variable local de objeto ( hFTP, CFTP_SERVIDOR, CFTP_SERVIDOR )
Set variable local de objeto ( hFTP, CFTP_USUARIO, CFTP_USUARIO )
Set variable local de objeto ( hFTP, CFTP_PASSWORD, CFTP_PASSWORD )
Set variable local de objeto ( hFTP, CFTP_SUBCARPETA, CFTP_SUBCARPETA )
Set variable local de objeto ( hFTP, CARCHIVO_LOCAL, CARCHIVO_LOCAL )
Set variable local de objeto ( hFTP, LVER_LOG, LVER_LOG )
Disparar objeto ( hFTP, 1º plano: Local (síncrono), LOK )
  Libre
Libre
If ( LOK )
  Rem ( En CRESULTADO tenemos el resultado )
  Get variable local de objeto ( hFTP, CRESULTADO, CRESULTADO )
Else
  Rem ( La variable CERROR no estará vacía )
  Get variable local de objeto ( hFTP, CERROR, CRESULTADO )
Libre

Un formulario de ejemplo con el resultado:


El proceso devuelve el FALLO y no muestra el Log.

En la carpeta Home del servidor FTP no hay permiso de escritura.

Saludos
Paco Satué

Muy Bueno Paco Y muy bueno David, y lo mas importante es que rescatan el epiritu del foro que se había perdido… no se por que en una oportunidad velneo trato el tema de cerrar el foro supongo que para vendernos horas de consulta… y luego esa idea de crear un foro para los Lores y otros para los comunes que esta en la actualidad y que supongo tiene este foro medio muerto con este tipo de aportes.

Hola,

Tengo una pequeña curiosidad que no he sabido solucionar, y es que en la linea donde se monta el archivo .bat que usaremos para subir los ficheros al FTP, hay escrito al principio lo siguiente “@echo off”, si dejo este codigo tal y como esta originalmente montado , no me funciona el proceso de subidaal FTP, en cambio si quito el siguiente código “@echo off” de la linea original si que funciona el proceso de subir el archivo al FTP.

¿Alguien tiene alguna idea del porque?

Lo pregunto porque el comando “@echo” tiene como finalidada el mostrar o ocultar el texto en procesos por lotes, pero no entiendo porque funciona o no la ejecución del comando ftp

Saludos
Ramon Denuc

Hola Ramón:

El .bat debería ser:
@echo off
ftp -n -s: …

De modo que para grabarlo deberían ser 2 líneas o bien indicar \n tras @echo off

Prueba y comentas
Un saludo
Juanjo

Buenas tardes

Realmente con la gestión documental incorporada en la versión última, (me refiero a amazon S3) tal vez se nos simplifique mucho este tema.

Saludos.

Gracias a todos por la participación y los comentarios. Gracias Paco por tu aportación.

Hola David, buscando en el foro he dado con tu solución la cual me ha servido de mucho, pero tengo una duda, ¿el comando ftp -n -s me servirá igualmente para conectar con servidores ftp seguros (sftp o que vayan por el puerto 22 en vez de por el 21)?.

Muchas gracias por tu gran aportación.

Échale un vistazo a la utilidad WinSCP

https://winscp.net/eng/docs/lang:es

Muchas gracias David.

Saludos.