
Chunk Upload con Azure Blob Storage
Si has trabajado con carga de archivos en Azure Blob Storage, probablemente hayas pensado: ¿El archivo como tal (todo el flujo de bytes) debe pasar por mi backend? Luego, ¿debe ser este backend quien haga la subida al servicio de Azure Blob Storage? Aunque es una forma técnicamente válida de hacerlo, todo tiene sus pros y sus contras. Por ejemplo:
Pros:
- Subir archivos desde el backend se puede percibir como un enfoque más seguro, ya que no hay necesidad de exponer claves de cuenta y el servicio de Blob Storage no estaría expuesto.
Contras:
- Subir archivos se puede considerar una tarea medianamente pesada. Por ejemplo, imagina que tienes una funcionalidad que carga archivos de 2 MB con mucha frecuencia (masivo). En este escenario, subir archivos terminará saturando la memoria en picos de uso.
- Dependiendo de cómo manejes la subida de los archivos desde el backend, puede representar un riesgo, ya que un archivo “infectado” puede quedarse en tus servidores en el camino de cargarlo al servicio de Blob Storage.
- Para carga de archivos grandes, se debe implementar el mecanismo de subida por bloques o chunks para evitar la saturación de la memoria. Esto incrementa la complejidad, ya que se debe implementar lógica para subir parte por parte y luego unirlo en un solo stream, garantizando la limpieza del espacio temporal que se usa hasta unir todas las piezas del archivo.
Sin embargo, existe una alternativa de carga de archivos a Azure Blob Storage directo desde el frontend usando la librería SDK de Azure para Blob Storage para JavaScript y el flujo de generación de SAS de delegación. Comparemos los pros y los contras:
Pros:
- El archivo no pasaría por nuestro backend, lo cual nos libra de la preocupación de picos de saturación de memoria.
- No hay riesgos inherentes de cargar archivos “infectados”, ya que el archivo va directo a Blob Storage. Sin embargo, en Blob Storage se puede activar escaneos de Azure Defender para aumentar la protección.
- Nos liberamos de la preocupación de manejo de archivos grandes, ya que el SDK de JavaScript implementa chunk upload por defecto.
- No hay necesidad de exponer claves de cuenta. Con el flujo de SAS de delegación, ni el backend ni el frontend deben conocer la clave de cuenta.
Contras:
- El Storage Account debe estar habilitado para acceso público. Incluso esto no representa una debilidad, ya que los contenedores y blobs deben ser privados; la única forma de acceder es con autenticación (para ello es el SAS Token).
Si aún no conoces el flujo de delegación de usuario y generación de SAS de delegación, te dejo un pequeño artículo donde explico en qué consiste, con un diagrama y un ejemplo con código:
Acceder de forma segura a Azure Blob Storage
La subida de archivos con SAS token de delegación y el SDK de JavaScript desde el frontend se puede representar de la siguiente manera:

- El frontend, desde el browser (bajo el contexto de sesión de usuario), invoca a la API/servicios que genera el SAS Token.
- El backend del API le pide al servicio de Blob Storage la generación del SAS Token de delegación y lo retorna al frontend. Para poder hacer esto, la API debe estar desplegada en un servicio de cómputo de Azure que cuente con una Managed Identity y con el rol otorgado de Blob Storage Data Contributor.
- Con este SAS Token, el frontend puede cargar el archivo desde el navegador de forma segura, ya que el SAS solo tiene permiso para cargar ese archivo y tiene una vigencia corta de tiempo de vida. La subida por chunks se hará de forma automática si es un archivo grande.
El SDK de JavaScript cuenta con métodos y propiedades que permiten establecer los tamaños del bloque y a partir de qué tamaño utilizará la subida por bloques. Por ejemplo, por defecto, si el archivo pesa menos de 250 MB, el SDK solo hace una petición.
Para culminar, dejo un repositorio de ejemplo. Este ejemplo cuenta con dos proyectos: un proyecto .NET, que es la API para generar el SAS Token, y un proyecto React.js, que es el cliente que hace uso de este token.
Repositorio de ejemplo de chunk upload con el SDK de JavaScript
¿Cómo verifico que se hace la carga por chunks?
En las Developer Tools del browser debes poder ver varias peticiones en paralelo, así como en la siguiente imagen:

Conclusión
Cargar archivos con SAS Token es una forma segura y práctica de sacarle provecho al servicio de Azure Blob Storage, evitando así muchas preocupaciones técnicas de carga de archivos.
Sígueme en Linkedin para estar al tanto de mis publicaciones y novedades