Cargar archivos desde PowerApps a bibliotecas de SharePoint

Hola a tod@s, en la siguiente entrada vengo a presentaros como cargar en bibliotecas de SharePoint Online ficheros desde una aplicación de PowerApps a través de Power Automate.

Hay que indicar en un principio, que el artículo que tenía pensado redactar, tenía como objetivo explicar cómo subir ficheros de más de 75Mb de tamaño, a las bibliotecas de documentos de SharePoint Online desde una aplicación de PowerApps, pero después de realizar muchas pruebas con diferentes técnicas, métodos y herramientas, he de reconocer que ha sido ¡Un fracaso absoluto!

Bueno, hay que reconocer que tan poco ha sido en valde todos los intentos realizados para conseguir este objetivo, ya que me ha servido para entender más en profundidad, cómo trabajan las herramientas de SharePoint, PowerApps, Power Automate y OneDrive, con los ficheros que tienen un tamaño grande, como puedes ser los videos.

Por todo ello, en este artículo se explican los siguientes puntos para entender como subir ficheros desde PowerApps:

  • Limites oficiales
  • Pruebas de carga de ficheros
  • Más allá del limite
  • Otras soluciones posibles
  • Cargar ficheros desde PowerApps

Limites oficiales

En el artículo Data types in PowerApps, que nos ofrece Microsoft, habla que los límites de los tamaños de los ficheros que se pueden manejar en PowerApps, vienen determinados por la memoria disponible en el dispositivo por parte de la aplicación a la hora de manejar los tipos binarios.

Esto es una verdad a media, ya que, en los inicios del proceso de carga, se observa que hay un gran consumo de memoria en el dispositivo. Esta memoria consumida inicialmente, se recupera en los siguientes pasos del proceso de cargar ficheros en la biblioteca en SharePoint.

El otro limite, que impide subir ficheros de gran tamaño a SharePoint, desde la PowerApps, está en el flujo de Power Automate que se maneja para subir estos ficheros. Esto es debido a que hay una limitación del tamaño de transferencia de los datos de entrada y salida en los flujos.

Ante este tipo de error, esta limitación, está en que no se puede cambiar el tamaño de la transferencia de datos de la Request para ampliarlo, como cuando se modifica la propiedad 'maxRequestLength' del fichero web.config desplegado en el IIS del servidor.

Pruebas de carga de ficheros

En estos apartados se muestra una tabla con una serie de pruebas de carga de ficheros con diferentes tamaños, que se han realizado, para comprobar y comprender los límites de PowerApps, Power Automate y SharePoint.

Para todas pruebas realizadas, se han realizado con las dos versiones que se explican más adelante en el artículo, como desde diferentes navegadores web, para comprobar si había diferencias en los resultados obtenidos.

Las conclusiones que se obtenido con todas las pruebas realizadas son las siguientes:

  • Para dispositivos tradicionales que disponen de poca memoria RAM, esa carencia, sí que influye en los procesos de carga de ficheros.

  • Para dispositivos móviles, su gestión de memoria es diferente a la gestión de memoria en Windows, por lo que la carga de ficheros de ciertos tamaños considerable, pueden ser una limitación a tener en cuenta.

  • A partir de los 75 Mb del fichero, aunque el dispositivo disponga de memoria suficiente en el dispositivo, en la fase en la que se transfiere la información al flujo de Power Automate, se produce el error 413 por superar los límites permitidos en la transferencia de datos, para la Request enviada.

  • A partir de los 100 Mb de tamaño, en la aplicación de PowerApps, se produce algún error que no he sido capaz de localizar su definición, pero entiendo que está relacionado con el gran volumen de información que tiene que manejar la aplicación.

  • Durante algunos procesos de cargas, se puede mostrar mensajes en el navegador parecidos al que se muestran cuando algún proceso de JavaScript está tardando más de lo habitual.

Más allá del limite

El objetivo de este apartado, no solo es enumerar ciertas técnicas empleadas para superar los límites iniciales mencionados, sino dejar constancias de los nuevos límites descubiertos y decidir si merece la pena invertir más tiempo en investigar cómo superar estos nuevos límites o por lo contrario invertir ese tiempo en dar otro enfoque dentro del proyecto para intentar cumplir al máximo los requisitos de nuestro cliente.

A continuación, se indican algunas de las técnicas utilizadas:

  • Divide y vencerás: Aunque a Julio Cesar, le sirvió para ganar muchas batallas en el pasado, aquí se ha aplicado para dividir el contenido del fichero que está en Base64 en bloques más pequeños y manejables.

    Posteriormente esos bloques se almacenan en una lista auxiliar, se reconstruye el fichero en el flujo de Power Automate y se almacena en la correspondiente biblioteca de SharePoint.

    Esta técnica funciona con ficheros pequeños, pero con ficheros grandes surgen los siguientes problemas y limitaciones:

    • La experiencia y su feedback con el usuario es nefasta, ya que el proceso de carga se eterniza en el tiempo.

    • Se producen 'Timer Out' en los flujos de Power Automate, por lo que la respuesta se pierde y los siguientes comandos a ejecutar en la PowerApps, no se procesan o se ejecutan incorrectamente.

    • Al obtener los bloques del fichero de la lista auxiliar, a través del componente de Power Automate, hay un límite de cuanta información se puede transferir en una consulta. Esto nos fuerza a implementar diversas consultas para obtener todos los bloques del fichero a reconstruir.

    • El conector que se encarga de crear el fichero en la biblioteca, solo crea ficheros con un tamaño máximo aproximado de 75Mb, los demás bloques del fichero del fichero se pierden, por lo que se crear un fichero corruptos en la biblioteca.

      NOTA: Esta activado la opción 'Transferencia de contenido' en el proceso de crear ficheros en la biblioteca de SharePoint, para crear el fichero a partir de paquetes más pequeños de su contenido, pero no he conseguido hacerlo funcionar correctamente.

    • Es necesario establecer procesos de eliminación de los datos de la lista auxiliar que contiene el contenido del fichero fraccionado con el fin de liberar espacio en la colección de sitios.

  • OneDrive como intermediario: Consistente en crear el fichero en un repositorio de OneDrive de un usuario de servicio, para luego a través de otro flujo de OneDrive, pasarlo a la biblioteca de SharePoint correspondiente.

    El problema viene, que al agregar un fichero grande en OneDrive, el flujo asociado a la creación de un nuevo fichero, no se activa y no transfiere el fichero a la biblioteca de SharePoint.

    NOTA: Si se hace este paso directamente desde la opción 'Copiar en' o 'Mover a' de OneDrive, no se produce ningún problema y se trasfiere el fichero a la biblioteca de SharePoint.

Después de haber invertido tiempo en intentar cargar ficheros de gran tamaño por otras técnicas, solo se ha conseguido cargar ficheros de tamaños similares a las técnicas tradicionales de subir ficheros desde una PowerApps, por lo que no merece la pena implementarlas por el gran coste de desarrollo que conlleva.

Otras soluciones posibles

Llegado a este punto, otras soluciones a esta limitación de carga de ficheros de más de 75 Mb a través de una aplicación de PowerApps son las siguientes:

  • Hacer entender al cliente, que hay una limitación de aproximadamente 75 Mb de tamaño de fichero que la PowerApps puede gestionar.

  • Subir directamente los ficheros a la biblioteca correspondiente en la colección de sitios y completar sus propiedades para que estén relacionadas con el resto de contenido de la aplicación de PowerApps, ya que SharePoint permite cargar ficheros de gran tamaño directamente en sus bibliotecas.

  • Dependiendo de la importancia que tenga los ficheros en la aplicación desarrollado, igual el enfoque de desarrollarlo en una PowerApps no es el más indicado y es mejor implementar la aplicación por ejemplo en un componente SPfx.

    A continuación, os dejo una animación de un desarrollo que implemente hace tiempo, de cómo subir ficheros a una biblioteca de SharePoint utilizando JavaScript, donde la limitación de subida de ficheros por esta técnica es de 250 Mb.

    Debería de implementar esta solución SPfx, como un componente reutilizable, para otros desarrollos de componentes SPfx, en una entrada futura en el Blob

  • Investigar los diferentes conectores que hay en Power Automate, por si hubiera algún conector cubriera las necesidades del cliente con referencia a ficheros de gran tamaño.

Cargar ficheros desde PowerApps

En este apartado se van a mostrar dos formas de cargar ficheros desde una aplicación de PowerApps, a la biblioteca de SharePoint.

Estas dos versiones, son muy parecidas, varían en los desencadenantes de PowerApps utilizados y la forma de manejarlos. Dentro del flujo de Power Automate, son muy parecidos, salvo el tratamiento del contenido del fichero, a la hora de crear el fichero en la biblioteca de SharePoint.

En la parte de la PowerApps, varían en cómo hay que procesar los datos de entrada en los flujos, de los controles que manejan, pero los pasos previos y posteriores a la ejecución del flujo, son los mismos.

Cargar fichero (Versión 1)

Para aplicar esta técnica se va a comenzar por crear un flujo de Power Automate con el desencadenante 'PowerApps' de PowerApps.

La estructura del flujo seria la siguiente, después del desencadenante de PowerApps:

  • Parámetros de entrada: Corresponde a los parámetros de entrada del flujo, que va a necesitar el nombre del fichero y el contenido del fichero en Base 64.

  • Parámetros de salida: Esta sección es opcional, pero si la lógica de negocio de la aplicación si los requirieras, el flujo de Power Automate, puede devolver los datos necesarios.

    Veo coherente, al menos indicar a la PowerApps, si el proceso del flujo se ha ejecutado correctamente.

  • Variables del flujo: Esta sección esta debido a que los flujos los creo como paquetes de solución y se utilizan sus variables de entorno, por si hubiera que desplegar el flujo u otros componentes en los siguientes entornos de la organización.

  • Conector para la creación el fichero en la biblioteca de SharePoint.

    En la sección 'Contenido del archivo', hay que convertir el contenido del fichero que viene en Base 64 a binario, con una formular de Power Automate.

  • Sección de la gestión de errores: Donde se controla los errores inesperados y se encarga de establecer los valores de retorno a la PowerApps.

  • Conector que se encarga de devolver los valores de retorno a la PowerApps.

    NOTA IMPORTANTE: Aun que los tipos de las variables definidas son de tipos distintos a cadena de texto, la devolución de parámetros a la PowerApps se hace en formato cadena de texto, ya que sino los valores devueltos están vacíos.

Al final, el flujo de Power Automate, se representaría con el siguiente diagrama:

Una vez que ya se dispone del flujo de Power Automate destinado a la carga de ficheros, se procede a crear la lógica de negocio en la PowerApps para su manejo. Para esta lógica de negocio, se necesitan los siguientes componentes de PowerApps:

  • Control para seleccionar el fichero que se quiere subir a la biblioteca.

    Se configura la propiedad 'MaxAttachmentSize' del control, para indicar el tamaño máximo de los datos adjuntos.

  • Control de tipo imagen, que se utiliza para obtener posteriormente el 'StringBase64' del contenido del fichero que se quiere subir a la biblioteca.

  • Botón que se encarga de iniciar el proceso de carga de ficheros en SharePoint a través del flujo de Power Automate.

NOTA: Los demás componentes que se muestran en la imagen son componentes decorativos dentro de la PowerApps o pertenecen a las otras versiones de carga de ficheros.

Una vez puestos los controles y configurados sus propiedades, la capa de negocio a estableces en esta versión es la siguiente:

  • Establecer en la propiedad 'Image' del control imagen el elemento del control seleccionador de ficheros.

  • En el evento 'OnSelect' del botón, se establece las siguientes secuencias de comando, para cargar el fichero en la biblioteca de SharePoint a través del flujo.

    1. Aunque no es obligatorio, establecer los controles de validación correspondientes.

    2. Obtener el contenido de la imagen en Base 64 a través de la función JSON de PowerApps. Este valor se almacena en una variable de contexto de la PowerApps.

    3. El contenido del fichero en Base 64, contiene más información a parte de su contenido, por lo que hay que eliminarlo para el proceso de carga. Eso realiza con la siguiente formula de PowerApps y se vuelve a almacenar el valor en la misma variable de contexto.

      NOTA: Si el contenido en Base 64 tiene un valor similar al que se muestra, al aplicar la formula mencionada, obtenemos únicamente el contenido del fichero

      "data:image/jpeg;base64,/9j/4QD9RXhpZgAATU0AKgAAA..."

      /9j/4QD9RXhpZgAATU0AKgAAA...

    4. Se ejecuta el flujo destinado subir el fichero en la biblioteca de SharePoint, con los parámetros de entradas requeridos y se almacena en una variable de contexto el resultado arrojado por el flujo.

    5. A partir de aquí se evalúa los resultados obtenidos del flujo y se continua con la lógica de negocio de la aplicación.

      En este caso se ha optado por rellenar algunas propiedades del fichero adjunto subido en la biblioteca.

      Se ha optado hacer este proceso en PowerApps, por no complicar más este proceso en el flujo de Power Automate

Con estos pasos, ya se pueden subir ficheros entre los 70Mb y 75Mb como máximo a la biblioteca de documentos de SharePoint desde una PowerApps.

Cargar fichero (Versión 2)

Para aplicar esta técnica se va a comenzar por crear un flujo de Power Automate con el desencadenante 'PowerApps (V2)' de PowerApps.

La estructura del flujo seria la siguiente, después de seleccionar el desencadenante de PowerApps:

  • Parámetros de entrada: Para este desencadenante, los parámetros de entrada se integran directamente en el desencadénate de PowerApps, sin necesidad de configurar nuevas variables en el flujo.

    Este desencadenante permite disponer de una entrada un tipo 'Archivo', con el que se dispone a la vez de nombre y contenido del fichero para su creación en la biblioteca de SharePoint.

  • Parámetros de salida: Esta sección es opcional, pero si la lógica de negocio de la aplicación si los requiriera, el flujo de Power Automate, puede devolver los datos necesarios.

    Veo coherente, al menos indicar a la PowerApps, si el proceso del flujo se ha ejecutado correctamente.

  • Variables del flujo: Esta sección esta debido a que los flujos los creo como paquetes de solución y se utilizan sus variables de entorno, por si hubiera que desplegar el flujo u otros componentes en los siguientes entornos de la organización.

  • Conector para la creación el fichero en la biblioteca de SharePoint.

    En la columna 'Contenido del archivo', hay que establecer el valor del paramero de entrada del desencadénate.

    En la columna 'Nombre de archivo', hay que poner la siguiente formula en su control, para poner el nombre del fichero, proporcionado en el parámetro de entrada en el desencadenante de la Power Automate.

    @{triggerBody()?['file']?['name']}
  • Sección de la gestión de errores: Donde se controla los errores inesperados y se encarga de establecer los valores de retorno a la PowerApps.

  • Conector que se encarga de devolver los valores de retorno a la PowerApps.

    NOTA IMPORTANTE: Aun que los tipos de las variables definidas son de tipos distintos a cadena de texto, la devolución de parámetros a la PowerApps se hace en formato cadena de texto, ya que sino los valores devueltos están vacíos.

Al final, el flujo de Power Automate, se representaría con el siguiente diagrama:

Una vez que ya se dispone del flujo de Power Automate destinado a la carga de ficheros, se procede a crear la lógica de negocio en la PowerApps para su manejo. Para esta lógica de negocio, se necesitan los siguientes componentes de PowerApps:

  • Control para seleccionar el fichero que se quiere subir a la biblioteca.

    Se configura la propiedad 'MaxAttachmentSize' del control, para indicar el tamaño máximo de los datos adjuntos.

  • Botón que se encarga de iniciar el proceso de carga de ficheros en SharePoint a través del flujo de Power Automate.

NOTA: Los demás componentes que se muestran en la imagen son componentes decorativos dentro de la PowerApps o pertenecen a las otras versiones de carga de ficheros.

Una vez puestos los controles y configurados sus propiedades, la capa de negocio a estableces en esta versión es la siguiente:

  • En el evento 'OnSelect' del botón, se establece las siguientes secuencias de comando, para cargar el fichero en la biblioteca de SharePoint a través del flujo.

    1. Aunque no es obligatorio, establecer los controles de validación correspondientes.

    2. Se ejecuta el flujo destinado a subir el fichero en la biblioteca de SharePoint, con los parámetros de entradas requeridos y se almacena en una variable de contexto el resultado arrojado por el flujo.

    3. A partir de aquí se evalúa los resultados obtenidos del flujo y se continua con la lógica de negocio de la aplicación.

      En este caso se ha optado por rellenar algunas propiedades del fichero adjunto subido en la biblioteca.

      Se ha optado hacer este proceso en PowerApps, por no complicar más este proceso en el flujo de Power Automate

Con estos pasos, ya se pueden subir ficheros entre los 70Mb y 75Mb como máximo a la biblioteca de documentos de SharePoint desde una PowerApps.

¿Qué versión elegir?

La respuesta dependerá de las necesidades de cada desarrollo y cliente, pero todo aquello que simplifique la tarea, será lo más recomendado, que en este caso es la versión 2, por lo siguientes motivos:

  • El desencadenante de la versión 2, es una evolución del desencadénate de la versión 1, lo que que trae mejoras a la hora de trabajar con estos tipos de flujos.

  • A nivel de PowerApps, usa menos controles y menos lógica de negocio para subir ficheros a SharePoint.

  • A nivel de Power Automate, el paso de parámetros es más sencillo, ya que desaparece la opción 'Preguntar en PowerApps' y sus complicaciones adyacentes. De esta forma se obtiene un flujo más limpio de manejar y mantener.

  • A nivel de características de la Power Automate, se agrega la sección 'Ejecutar solo los usuarios' para establecer los niveles de permisos de ejecución si se tuviera que ejecutar con un usuario concreto, que no estaba en la primera versión.

A continuación, se muestra una secuencia de cómo trabajan las dos versiones comentadas en la PowerApps desde un sitio de comunicación de SharePoint.

Entradas populares de este blog

Dataverse vs. SharePoint Online: ¿Cuál es el repositorio adecuado para ti?

La librería