54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
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 1–100 vão para pasta 100; IDs 101–200 → 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}")
|