MirrorAPI/actions/file/save_file_from_base64.py

54 lines
1.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from fastapi import HTTPException, status
import base64
# Salva o arquivo Base64 em disco e retorna o caminho completo
def save_file_from_base64(
base64_content: str, file_name: str, ato_id: int, upload_dir: str, group_size: int
) -> str:
"""
Decodifica o Base64, salva o arquivo em disco dentro de uma hierarquia
baseada no 'ato_id', e retorna o caminho completo do arquivo salvo.
Estrutura de diretórios:
storage/
100/
57/
documento.pdf
"""
# Garante que o diretório base de uploads existe
upload_dir.mkdir(parents=True, exist_ok=True)
# --- NOVO BLOCO: define a faixa de agrupamento ---
# Exemplo: IDs 1100 vão para pasta 100; IDs 101200 → 200
faixa_superior = ((ato_id - 1) // group_size + 1) * group_size
# Define o caminho hierárquico: storage/100/57/
target_dir = upload_dir / str(faixa_superior) / str(ato_id)
target_dir.mkdir(parents=True, exist_ok=True)
# Caminho completo do arquivo final
file_path = target_dir / file_name
# Caminho para visualização via url (relativo ao storage)
# Exemplo: "100/57/documento.pdf"
file_url = f"{faixa_superior}/{ato_id}/{file_name}"
try:
# Decodifica o Base64
file_bytes = base64.b64decode(base64_content)
# Grava o arquivo em disco
with open(file_path, "wb") as f:
f.write(file_bytes)
# Retorna o caminho completo do arquivo salvo para visualização via URl
return str(file_url)
except base64.binascii.Error:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=f"O conteúdo do arquivo '{file_name}' não é um Base64 válido.",
)
except Exception as e:
raise Exception(f"Erro inesperado ao salvar arquivo '{file_name}': {e}")