---
name: file_validate_type
kind: function
lang: go
domain: infra
version: "1.0.0"
purity: pure
signature: "func FileValidateType(header []byte, allowedTypes []string) (string, bool)"
description: "Detecta el MIME type real de un archivo a partir de sus primeros bytes (magic bytes) y verifica que esta en la lista de tipos permitidos. Mas seguro que confiar en el header Content-Type del request."
tags: [file, validate, mime, magic, security, upload, infra]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: [bytes]
params:
  - name: header
    desc: "primeros bytes del archivo (al menos 12 bytes para detectar todos los formatos soportados)"
  - name: allowedTypes
    desc: "lista blanca de MIME types permitidos (ej: [\"image/png\", \"image/jpeg\", \"application/pdf\"])"
output: "tupla (mime_detectado, permitido). Si no se reconoce el tipo retorna (\"\", false). Si se reconoce pero no esta en allowedTypes retorna (mime, false)"
tested: true
tests: ["detecta JPEG por magic bytes", "detecta PNG por magic bytes", "detecta PDF", "detecta WebP con prefix RIFF y suffix WEBP", "rechaza tipo no permitido", "tipo desconocido retorna vacio"]
test_file_path: "functions/infra/file_validate_type_test.go"
file_path: "functions/infra/file_validate_type.go"
---

## Ejemplo

```go
data, _ := os.ReadFile("./uploads/some.bin")
mime, ok := FileValidateType(data[:12], []string{"image/png", "image/jpeg"})
if !ok {
    log.Printf("tipo no permitido: %s", mime)
}
```

## Notas

Funcion pura — sin I/O, determinista. Tabla interna de signatures soportados:

| Tipo | Magic bytes |
|------|-------------|
| JPEG | `FF D8 FF` |
| PNG | `89 50 4E 47 0D 0A 1A 0A` |
| GIF | `47 49 46 38` |
| PDF | `25 50 44 46` |
| WebP | `52 49 46 46 ?? ?? ?? ?? 57 45 42 50` |
| ZIP | `50 4B 03 04` |

NO es un antivirus. Solo verifica los primeros bytes — un archivo puede tener magic valido pero contenido malicioso despues. Para apps con requisitos de seguridad altos, complementar con escaneo adicional.
