Adjuntos en incidencias
Las entidades pueden adjuntar ficheros a cualquier mensaje del histórico de una incidencia (el mensaje inicial al crearla, o cualquier comentario posterior). Los adjuntos quedan ligados al mensaje y se pueden descargar posteriormente.
Subir adjuntos
Sube uno o varios ficheros vinculados a un mensaje concreto del histórico de una incidencia. La petición debe ser multipart/form-data.
Parámetros de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
id |
int | ID de la incidencia |
Campos del formulario
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
idhistorico |
int | Sí | ID del mensaje al que se adjuntan los ficheros. Se obtiene al crear la incidencia (idhistorico en la respuesta de POST /incidencias) o al añadir un comentario (id en la respuesta de POST /incidencias/{id}/comentario) |
archivos |
file[] | Sí | Uno o varios ficheros a subir (máximo 3 por petición) |
Límites
| Límite | Valor |
|---|---|
| Número máximo de archivos por petición | 3 |
| Tamaño máximo por archivo | 5 MB |
| Tipos MIME permitidos | image/jpeg, image/png, image/gif, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
En lenguaje humano: imágenes JPG/PNG/GIF, PDF, Word (.doc, .docx) y Excel (.xls, .xlsx).
Ejemplo de petición
# Crear una incidencia y adjuntar un fichero al mensaje inicial
RESPUESTA=$(curl -s -X POST \
"https://apientidades-pro.transparenciacanarias.org/apientidades/v1/incidencias" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"titulo\": \"Error con captura\",
\"descripcion\": \"Ver captura adjunta\",
\"tipo\": 3,
\"usuarioId\": 501
}")
ID=$(echo $RESPUESTA | jq -r '.id')
IDHISTORICO=$(echo $RESPUESTA | jq -r '.idhistorico')
# Subir captura al mensaje inicial
curl -s -X POST \
"https://apientidades-pro.transparenciacanarias.org/apientidades/v1/incidencias/$ID/adjuntos" \
-H "Authorization: Bearer $TOKEN" \
-F "idhistorico=$IDHISTORICO" \
-F "archivos=@captura.png" \
-F "archivos=@log_error.pdf" | jq .
import requests
BASE_URL = "https://apientidades-pro.transparenciacanarias.org/apientidades/v1"
headers = {"Authorization": f"Bearer {token}"}
# 1. Crear la incidencia
payload = {
"titulo": "Error con captura",
"descripcion": "Ver captura adjunta",
"tipo": 3,
"usuarioId": 501
}
resp = requests.post(f"{BASE_URL}/incidencias", headers=headers, json=payload)
incidencia = resp.json()
# 2. Adjuntar ficheros al mensaje inicial
files = [
("archivos", ("captura.png", open("captura.png", "rb"), "image/png")),
("archivos", ("log.pdf", open("log.pdf", "rb"), "application/pdf"))
]
data = {"idhistorico": incidencia["idhistorico"]}
resp = requests.post(
f"{BASE_URL}/incidencias/{incidencia['id']}/adjuntos",
headers=headers,
files=files,
data=data
)
for adj in resp.json():
print(f"Adjuntado id={adj['id']} nombre={adj['nombre']}")
using var form = new MultipartFormDataContent();
form.Add(new StringContent(idHistorico.ToString()), "idhistorico");
var captura = await File.ReadAllBytesAsync("captura.png");
var capturaContent = new ByteArrayContent(captura);
capturaContent.Headers.ContentType = new MediaTypeHeaderValue("image/png");
form.Add(capturaContent, "archivos", "captura.png");
var response = await client.PostAsync(
$"{baseUrl}/incidencias/{idIncidencia}/adjuntos", form);
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);
Respuesta exitosa (200 OK)
[
{
"id": 451,
"idhistorico": 987,
"nombre": "captura.png",
"tamano": 124532,
"tipomime": "image/png",
"fecha": "2026-04-06T12:34:56"
},
{
"id": 452,
"idhistorico": 987,
"nombre": "log_error.pdf",
"tamano": 54321,
"tipomime": "application/pdf",
"fecha": "2026-04-06T12:34:57"
}
]
Array con un elemento por cada fichero subido. El campo id es el que se usará después para descargar cada adjunto.
Validaciones
| Validación | Error |
|---|---|
idhistorico pertenece a la incidencia indicada y a la entidad autenticada |
400 |
| Número de archivos entre 1 y 3 | 400 |
| Cada archivo no vacío | 400 |
| Cada archivo ≤ 5 MB | 400 |
| Tipo MIME en la lista de permitidos | 400 |
Doble validación de pertenencia
El servidor comprueba que idhistorico → idincidencia → identidad coincide con la entidad autenticada. Esto impide que un cliente malicioso suba adjuntos a una incidencia de otra entidad usando un idhistorico obtenido por otros medios.
Descargar un adjunto
Descarga el fichero binario de un adjunto. El servidor verifica que el adjunto pertenece a una incidencia de la entidad autenticada antes de servir el contenido.
Parámetros de ruta
| Parámetro | Tipo | Descripción |
|---|---|---|
idAdjunto |
int | ID del adjunto (campo id devuelto en la respuesta de subir, o en el array historico[].adjuntos[] del detalle de la incidencia) |
Ejemplo de petición
Respuesta exitosa (200 OK)
El cuerpo de la respuesta es el fichero binario. Las cabeceras relevantes:
| Cabecera | Valor |
|---|---|
Content-Type |
Tipo MIME original del fichero (ej. image/png, application/pdf) |
Content-Disposition |
attachment; filename="<nombre original>" |
Errores posibles (ambos endpoints)
| Código | Descripción |
|---|---|
400 |
Validación fallida en subida (tipo MIME no permitido, >3 archivos, fichero vacío, idhistorico no pertenece a la incidencia) |
401 |
Token ausente, expirado o inválido |
404 |
Incidencia no encontrada, no pertenece a la entidad, o el adjunto no pertenece a ninguna incidencia de la entidad |
Consultar adjuntos existentes
Para ver qué adjuntos tiene una incidencia, use GET /incidencias/{id}: el detalle devuelve el array historico[] donde cada mensaje tiene su propia lista adjuntos[] con el id, nombre, tamano, tipomime y fecha de cada fichero. Use ese id para descargar.