GET /api/chat-images/:name — CF Pages Function para servir imágenes del chat desde R2
GET /api/chat-images/:name — CF Pages Function para servir imágenes del chat desde R2
Cloudflare Pages Function en functions/api/chat-images/[name].ts. Streama objetos del bucket R2 TASK_ATTACHMENTS (prefijo chat/) como respuestas HTTP, permitiendo que los links [abrir imagen:URL] del chat sean accesibles directamente en el navegador.
Contrato HTTP
GET /api/chat-images/:name
donde :name es el filename devuelto por POST /api/chat/upload-image (p. ej. a3b2c1d0-uuid.png).
Respuestas
| Status | Situación | Body |
|---|---|---|
200 OK | Imagen encontrada | Stream del objeto R2 |
400 Bad Request | Nombre vacío o no válido | { error: 'Invalid name' } |
404 Not Found | Objeto no existe en R2 | { error: 'Not found', r2_key } |
Headers de respuesta exitosa
Content-Type: image/png (o el MIME original almacenado en R2)
Content-Length: <bytes>
Content-Disposition: inline; filename="<nombre-encoded>"
Cache-Control: private, max-age=3600
Validación del parámetro name
Regex estricta: ^[A-Za-z0-9._-]+$
- Previene path traversal (ningún
/,..o carácter de control). - El nombre
uuid.<ext>generado porupload-imagesiempre pasa la validación. - Si el nombre no pasa →
400inmediato, sin contactar R2.
Entorno (Env)
interface Env {
TASK_ATTACHMENTS: R2Bucket;
}
El objeto se recupera con env.TASK_ATTACHMENTS.get('chat/<name>'). El Content-Type se lee de object.httpMetadata?.contentType (almacenado al subir); fallback application/octet-stream.
Autenticación
Protegido por CF Access a nivel de ruta global del workspace. Solo staff autenticado puede acceder a las imágenes — no hay URLs públicas sin sesión.
Relación con upload-image
| Endpoint | Ruta | Función |
|---|---|---|
POST /api/chat/upload-image | functions/api/chat/upload-image.ts | Persiste imagen en R2, devuelve URL |
GET /api/chat-images/:name | functions/api/chat-images/[name].ts | Sirve imagen desde R2 |
El flujo completo: upload → marcador en mensaje → renderBody detecta marcador → link → este endpoint.
Véase también
- [[feature—chat—avisos-maximize-paste-jitsi]]
- [[entity—chat—endpoint—upload-image]]
- [[entity—chat—service—chatnotify]]
- [[entity—chat—widget—teamchat]]
- [[workspace—dashboard]]