Volver a la wiki

POST /api/chat/upload-image — CF Pages Function para subir imágenes al chat

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

StatusSituaciónBody
201 CreatedSubida correcta{ filename, url, content_type }
400 Bad RequestNo es multipart o falta campo file{ error }
400 Bad RequestArchivo vacío{ error: 'Empty file' }
413 Content Too LargeSupera 5 MB{ error }
415 Unsupported Media TypeMIME 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ámetroValor
Tamaño máximo5 MB (5 * 1024 * 1024 bytes)
MIME permitidosimage/png, image/jpeg, image/webp, image/gif
Nombre del objeto R2<uuid-v4>.<ext> (UUID generado con crypto.randomUUID())
Prefijo R2chat/
Metadata R2httpMetadata: { 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:

  1. Toma la extensión del nombre original del File si tiene ≤ 5 caracteres.
  2. Fallback a mapa MIME → ext (png, jpg, webp, gif).
  3. Último fallback: bin.

Véase también

Subir