Conclusiones clave
- Acepta una sola imagen de producto autorizada y limita su tamaño en bytes antes de que empiece el procesamiento de pago.
- Crea un derivado WebP versionado con redimensionamiento fit y el zoom desactivado para que los archivos de origen pequeños no se amplíen.
- Mantén la cuenta, el contenedor y la clave de Azure en credenciales de Template, no en campos de la Assembly ni en código del navegador.
Las imágenes de producto suelen llegar como archivos de cámara de tamaño excesivo, mientras que las páginas de catálogo necesitan un recurso de entrega predecible. Subir el archivo de origen directamente a Azure deja el formato, las dimensiones, los metadatos, el comportamiento de la caché y el acceso de revisión en manos de rutas de código separadas. Un Template bloqueado de tres etapas crea un único derivado cuya identidad de almacenamiento duradero y cuya URL temporal de revisión cumplen funciones distintas; la configuración de la cuenta y del contenedor de Azure define el límite del acceso anónimo.
Lo más importante
- Define Content-Type y un Cache-Control seguro para la revisión de forma deliberada, en lugar de depender de las suposiciones del destino.
- Trata una URL SAS como un acceso temporal de portador y guarda la ruta del blob, no la URL firmada, como identidad duradera.
- Concilia la exportación correcta con el producto exacto, la versión de origen, la versión del flujo de trabajo y el ID de la Assembly antes de la publicación.
Modela la identidad de origen, de procesamiento y de almacenamiento
Una foto de producto subida es la entrada de un flujo de trabajo, no un evento de publicación en el catálogo. Autentica a quien la sube, autoriza el registro del producto, valida el tipo de imagen detectado y el tamaño en bytes, y crea una operación de procesamiento duradera antes de aceptar el resultado de la Assembly. Conserva el archivo de origen editable o de alta resolución bajo una política de retención explícita, en lugar de suponer que el derivado WebP puede sustituirlo.
Asigna a cada derivado una versión del flujo de trabajo. El registro de la aplicación debería asociar el producto y la versión de origen con ese flujo de trabajo, con el ID de la Assembly correspondiente y con el contenedor de Azure y la ruta del blob resultantes. Así, un cambio posterior de calidad puede crear un nuevo derivado sin sobrescribir la versión revisada ni perder el camino de vuelta a su origen.
Identidad del origen
El producto, la subida original, la suma de comprobación o versión y el rol de retención.
Identidad del procesamiento
La versión guardada del flujo de trabajo y la Assembly que produjeron el derivado.
Identidad de almacenamiento
El límite de la cuenta de Azure, el contenedor y la ruta del blob con versión.
Construye el Template de imágenes de producto en Azure
El Template acepta un solo archivo mediante :original, lo envía a /image/resize y exporta únicamente el WebP resultante mediante /azure/store. El redimensionado fit mantiene la imagen completa dentro del recuadro solicitado, mientras que zoom con valor false evita que se amplíe un origen pequeño. La ruta con versión contiene un identificador de producto que solo se proporciona tras la autorización de la aplicación, además de la unicidad de la Assembly.
Configura allow_steps_override con el valor false para que un cliente de subida no pueda reemplazar el destino, solicitar una carga de trabajo mayor ni omitir el procesamiento. El objeto auth del Template limita la cantidad y el tamaño total de las subidas aceptadas. Esos límites reducen la carga de trabajo accidental, pero la aplicación debe seguir aplicando la pertenencia al inquilino, el estado de producto permitido, los límites de tasa y un valor de product_id permitido.
{
"allow_steps_override": false,
"auth": {
"max_number_of_files": 1,
"max_size": 52428800
},
"steps": {
":original": {
"robot": "/upload/handle"
},
"product_webp": {
"use": ":original",
"robot": "/image/resize",
"width": 1600,
"height": 1600,
"resize_strategy": "fit",
"zoom": false,
"format": "webp",
"quality": 82,
"strip": true
},
"azure_review": {
"use": "product_webp",
"robot": "/azure/store",
"credentials": "azure-product-images",
"path": "catalog/web-v1/${fields.product_id}/${assembly.id}/${file.url_name}",
"content_type": "image/webp",
"cache_control": "private, no-store",
"metadata": {
"workflow": "catalog-web-v1",
"source_id": "${fields.product_id}"
},
"sas_expires_in": 900,
"sas_permissions": "r",
"result": true
}
}
}Define las propiedades y los metadatos del blob como parte del contrato del recurso
Un WebP versionado debería salir del flujo de trabajo con un Content-Type explícito. El ejemplo utiliza almacenamiento en caché private, no-store durante la revisión para que una caché compartida no conserve una respuesta SAS con expiración. Como /azure/store escribe cache_control en el blob almacenado, ese valor private, no-store persiste en el objeto. Entregar más adelante ese mismo blob con una política de caché exige restablecer su Cache-Control o generar un nuevo derivado, en lugar de suponer que el valor usado durante la revisión se borra solo. Guarda metadatos estables y no sensibles, como el nombre del flujo de trabajo y el identificador del registro de origen, cuando los operadores necesiten rastrear un blob sin abrir la base de datos de la aplicación.
No coloques secretos, información personal ni un valor del navegador sin límites en los metadatos ni en las rutas de Azure. Trata product_id como un identificador de aplicación validado, con un límite documentado de caracteres y longitud. /azure/store convierte los valores de metadatos de tipo string, number y boolean en cadenas, por lo que los consumidores no deberían esperar que se conserven los tipos JSON originales.
Usa una URL SAS solo para una revisión efímera
/azure/store devuelve la URL firmada en el campo sas_url del resultado; el campo url común no está firmado. La subida crea una SAS incluso cuando se omite sas_expires_in, con una duración predeterminada del servidor. Omitir sas_permissions aplica un valor predeterminado con capacidad de escritura, no un acceso de solo lectura. Este ejemplo establece explícitamente sas_permissions en r y sas_expires_in en 900 segundos. Establece ambos valores en lugar de depender de los valores predeterminados para el acceso de revisión.
El Robot no configura el acceso anónimo. Mantén privado el contenedor de destino y revisa la opción AllowBlobPublicAccess de la cuenta de almacenamiento; si se prohíbe el acceso anónimo en el nivel de la cuenta, esa configuración prevalece sobre la del contenedor. Cualquiera que obtenga la URL SAS puede usar su acceso delegado durante el periodo de validez, así que no la guardes en los registros, no la incluyas en analíticas, no la envíes a clientes ajenos ni la almacenes como URL permanente del recurso del catálogo.
Conserva el contenedor y la ruta del blob como identidad duradera. Cuando un revisor necesite acceso más adelante, la aplicación debería autorizar esa solicitud y emitir u obtener el acceso conforme a su diseño de entrega actual. Una obtención exitosa de la SAS demuestra que el objeto se puede leer con ese token; no aprueba el recurso, no otorga la publicación en el catálogo ni sustituye la autorización a nivel de producto.
Verifica el comportamiento de las imágenes antes del cambio definitivo del catálogo
El Step de redimensionado establece strip en true, lo que elimina del derivado todos los metadatos incrustados, incluido el perfil de color ICC. Prueba la orientación EXIF, las imágenes anchas y altas, las entradas transparentes, el comportamiento del perfil de color, los orígenes muy pequeños, las dimensiones muy grandes, la animación y los datos con formato incorrecto. Compara la salida renderizada, así como su tipo MIME, sus dimensiones, su tamaño en bytes y sus metadatos de almacenamiento. Tanto la eliminación del perfil como la conversión a WebP pueden afectar al color renderizado o a otro comportamiento requerido.
Verifica que la configuración de la cuenta y del contenedor de Azure impida las lecturas anónimas del blob de revisión. Concilia la exportación exitosa con la operación de producto esperada y, después, haz avanzar el registro del catálogo mediante una transición autorizada aparte. Despliega primero una cohorte de tráfico pequeña, observa el comportamiento de entrega y de caché, y conserva el derivado anterior hasta que se cierre la ventana de reversión.
Realiza la recuperación sin publicar duplicados
Un tiempo de espera agotado o un webhook perdido es un resultado incierto, no una prueba de que el blob no se haya escrito. Guarda la operación antes de crear la Assembly y procesa de forma idempotente las notificaciones de finalización firmadas. Si quien realiza la llamada pierde la respuesta, revisa la Assembly existente y el registro de la aplicación antes de iniciar otra ejecución.
Clasifica los fallos por recepción, procesamiento de imágenes, autenticación de Azure, contenedor inexistente y exportación. Ofrece a los operadores acciones de recuperación estables y mantén protegidos los detalles sin procesar del proveedor. Una nueva ejecución del flujo de trabajo debería crear un objeto versionado nuevo y actualizar el catálogo solo después de la revisión; la eliminación del blob antiguo corresponde a una tarea de retención posterior.
Detalles técnicos que conviene conocer
- /upload/handle debe llamarse :original, no debe definir use y solo puede aparecer una vez en un conjunto de Assembly Instructions.
- /image/resize con resize_strategy establecido en fit conserva la relación de aspecto y mantiene cada lado dentro de los límites solicitados. Establecer zoom en false evita la ampliación de las entradas más pequeñas.
- /azure/store aplica content_type, content_encoding, content_language, cache_control y los metadatos al blob almacenado. Acepta content_disposition, pero actualmente no lo aplica al blob.
- /azure/store devuelve el acceso de revisión firmado en sas_url; el campo url ordinario no está firmado. sas_expires_in controla la duración y, si se omite, se aplica un valor predeterminado del servidor. Omitir sas_permissions aplica un valor predeterminado con permisos de escritura; los valores explícitos aceptan r (lectura), w (escritura) y d (eliminación). Este flujo de trabajo concede solo r para la revisión.
- /azure/store no tiene ningún parámetro de nivel de acceso. El acceso anónimo depende tanto de la configuración AllowBlobPublicAccess de la cuenta de almacenamiento como del nivel de acceso anónimo del contenedor. Impedir el acceso anónimo en el nivel de la cuenta prevalece sobre la configuración del contenedor.
- Una URL SAS otorga sus permisos delegados a cualquiera que la posea durante el período de validez de la firma.
- Los valores de metadatos de Azure que se proporcionan a /azure/store pueden ser cadenas, números o booleanos; el Robot los convierte en cadenas.
Un enfoque práctico
- 1
Define los tipos de imagen aceptados, el máximo de bytes, las dimensiones objetivo, la calidad y la política de retención del origen.
- 2
Crea credenciales de Template de Azure con alcance limitado y guarda el Template bloqueado de subida, redimensionamiento y almacenamiento.
- 3
Comprueba el contenedor real usando datos de prueba de orientación, transparencia, perfil de color y de tamaños inusualmente pequeños y grandes.
- 4
Concilia la ruta del blob, revisa mediante el SAS de corta duración y luego publica mediante una transición de catálogo independiente.
Cuándo resulta útil Transloadit
Usa /upload/handle para una recepción controlada de imágenes de producto, /image/resize para un derivado WebP acotado y /azure/store para un blob versionado en un contenedor de acceso privado. Deja que el Step de almacenamiento devuelva una URL SAS de solo lectura y corta duración para la revisión, pero persiste el contenedor y la ruta del blob como identidad duradera.
Límite de la arquitectura
Transloadit acepta la imagen del producto, crea un derivado WebP y lo escribe en un contenedor de Azure Blob Storage que el administrador de Azure o la aplicación han configurado para el acceso privado. La aplicación sigue siendo responsable de la autorización del producto, la retención del origen, el estado del catálogo, la política de entrega y toda decisión de exponer o reemplazar el derivado.
Preguntas frecuentes
¿Debería el catálogo guardar la URL SAS?
No. Una URL SAS es un acceso temporal de portador. Guarda el contenedor de Azure y la ruta del blob como identidad duradera y autoriza la entrega posterior de forma independiente.
¿El redimensionamiento con fit produce un cuadrado exacto?
No. Conserva la relación de aspecto y mantiene ambos lados dentro de los límites solicitados. Usa una política explícita de recorte o de relleno cuando se requieran dimensiones exactas.
¿Por qué usar una ruta de blob versionada?
Permite que coexistan políticas de calidad, hace predecible el comportamiento de la caché y admite la revisión y la reversión sin sobrescribir un recurso conocido.
¿Puede el navegador elegir el contenedor de Azure?
No. Mantén la cuenta, el contenedor y la clave en la credencial de Template bloqueada. Una aplicación de confianza puede proporcionar un identificador de producto acotado solo después de la autorización.
¿Una exportación correcta publica la imagen del producto?
No. Demuestra que el derivado llegó a Azure. La publicación en el catálogo sigue siendo una transición de estado independiente de la aplicación.