Files
fn_registry/functions/infra/file_unique_name.md
T

1.9 KiB

name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
name kind lang domain version purity signature description tags uses_functions uses_types returns returns_optional error_type imports params output tested tests test_file_path file_path
file_unique_name function go infra 1.0.0 pure func FileUniqueName(originalName string) string Genera un nombre de archivo unico combinando un UUID v4 con la extension sanitizada del nombre original. Evita colisiones y elimina problemas con caracteres especiales.
file
unique
name
uuid
upload
infra
false
path/filepath
strings
unicode
github.com/google/uuid
name desc
originalName nombre original del archivo (puede contener path, espacios, caracteres especiales)
nombre unico {uuid}.{ext} con extension sanitizada (alfanumerica, minusculas, max 16 chars). Si no hay extension retorna solo el UUID true
preserva extension comun como png
convierte extension a minusculas
remueve caracteres especiales en extension
genera UUID sin extension si el archivo no tiene
trunca extensiones extremadamente largas
functions/infra/file_unique_name_test.go functions/infra/file_unique_name.go

Ejemplo

n1 := FileUniqueName("vacaciones.PNG")
// n1 = "a1b2c3d4-e5f6-7890-abcd-ef1234567890.png"

n2 := FileUniqueName("contrato sin extension")
// n2 = "f9b6c2d1-..."  (solo UUID)

n3 := FileUniqueName("malicious; rm -rf /.exe.txt")
// n3 = "{uuid}.txt"

Notas

Marcada como pure por contrato (no hace I/O ni depende de estado mutable explicitamente), pero internamente la generacion del UUID v4 usa un PRNG por lo que el resultado NO es determinista. Esto es aceptable en la convencion del registry: la pureza se refiere a la ausencia de side effects observables (no escribe a disco, red, ni globals), no al determinismo bit a bit.

La extension se sanitiza para evitar:

  • Path traversal en disco (ej: ../../etc/passwd)
  • Inyeccion de comandos en logs/UI
  • Ambiguedad de filesystem entre mayus/minus