Saltar a contenido

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

POST /apientidades/v1/incidencias/{id}/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 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[] 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

GET /apientidades/v1/incidencias/adjuntos/{idAdjunto}

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

curl -s -X GET \
  "https://apientidades-pro.transparenciacanarias.org/apientidades/v1/incidencias/adjuntos/451" \
  -H "Authorization: Bearer $TOKEN" \
  -o captura_descargada.png
response = requests.get(
    f"{BASE_URL}/incidencias/adjuntos/451",
    headers=headers
)
if response.status_code == 200:
    # El nombre del archivo viene en Content-Disposition
    with open("captura_descargada.png", "wb") as f:
        f.write(response.content)
var response = await client.GetAsync($"{baseUrl}/incidencias/adjuntos/451");
if (response.IsSuccessStatusCode)
{
    var bytes = await response.Content.ReadAsByteArrayAsync();
    await File.WriteAllBytesAsync("captura_descargada.png", bytes);
}

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.