POST /api/chat/upload-image — CF Pages Function para subir imágenes al chat
Cloudflare Pages Function en functions/api/chat/upload-image.ts. Recibe una imagen pegada desde el portapapeles (Ctrl+V en el textarea del chat), la valida y la persiste en el bucket R2 TASK_ATTACHMENTS bajo el prefijo chat/.
No existe tabla de base de datos intermedia: el nombre del objeto R2 es directamente la referencia usada en el marcador de mensaje [abrir imagen:/api/chat-images/<filename>].
Contrato HTTP
POST /api/chat/upload-image
Content-Type: multipart/form-data
Campo: file (File / Blob)
Respuestas
| Status | Situación | Body |
|---|---|---|
201 Created | Subida correcta | { filename, url, content_type } |
400 Bad Request | No es multipart o falta campo file | { error } |
400 Bad Request | Archivo vacío | { error: 'Empty file' } |
413 Content Too Large | Supera 5 MB | { error } |
415 Unsupported Media Type | MIME no permitido | { error } |
Ejemplo de respuesta exitosa
{
"filename": "a3b2c1d0-…-uuid.png",
"url": "/api/chat-images/a3b2c1d0-…-uuid.png",
"content_type": "image/png"
}
Restricciones de validación
| Parámetro | Valor |
|---|---|
| Tamaño máximo | 5 MB (5 * 1024 * 1024 bytes) |
| MIME permitidos | image/png, image/jpeg, image/webp, image/gif |
| Nombre del objeto R2 | <uuid-v4>.<ext> (UUID generado con crypto.randomUUID()) |
| Prefijo R2 | chat/ |
| Metadata R2 | httpMetadata: { contentType }, customMetadata: { source: 'chat' } |
Entorno (Env)
interface Env {
TASK_ATTACHMENTS: R2Bucket; // Bucket R2 compartido con task attachments
}
El binding TASK_ATTACHMENTS es el mismo bucket usado por los adjuntos de tareas. Las imágenes del chat conviven bajo el prefijo chat/.
Autenticación
Protegido por CF Access a nivel de ruta global del workspace. Cualquier usuario staff con sesión activa puede subir. No hay autorización adicional a nivel de endpoint.
Flujo de extensión de nombre
La función extensionFor() determina la extensión del archivo:
- Toma la extensión del nombre original del
Filesi tiene ≤ 5 caracteres. - Fallback a mapa MIME → ext (
png,jpg,webp,gif). - Último fallback:
bin.
Véase también
- [[feature—chat—avisos-maximize-paste-jitsi]]
- [[entity—chat—endpoint—chat-images]]
- [[entity—chat—service—chatnotify]]
- [[entity—chat—widget—teamchat]]
- [[workspace—dashboard]]
Referenciado desde
- Chat del equipo — Avisos audio+badge, maximizar, paste imágenes y Jitsi (PR#58)
- Chat equipo: avisos audio+badge, maximizar, paste imágenes y Jitsi Meet
- chatNotify — Librería de notificaciones del chat (beep, badge, favicon)
- GET /api/chat-images/:name — CF Pages Function para servir imágenes del chat desde R2