fix(): Ajuste, configuração final de salvamento de arquivos com suas respectivas hierarquias
This commit is contained in:
parent
51f2f6b0bb
commit
52875cb037
2 changed files with 31 additions and 12 deletions
|
|
@ -6,6 +6,7 @@
|
|||
"password": "${DB_PASSWORD}",
|
||||
"aeskey": "${AES_KEY}",
|
||||
"storage": "${STORAGE}",
|
||||
"group_size": "${GROUP_SIZE}",
|
||||
"charset": "utf8mb4",
|
||||
"pool": {
|
||||
"pre_ping": true,
|
||||
|
|
|
|||
|
|
@ -20,6 +20,9 @@ from pathlib import Path
|
|||
# Configuração da Chave AES
|
||||
DB_SETTINGS = get_database_settings()
|
||||
AES_KEY = getattr(DB_SETTINGS, "aeskey", None)
|
||||
GROUP_SIZE = getattr(
|
||||
DB_SETTINGS, "group_size", None
|
||||
) # quantidade de atos por pasta de grupo
|
||||
|
||||
# --- CONFIGURAÇÃO DE DIRETÓRIO DE UPLOAD ---
|
||||
# **IMPORTANTE:** Configure este caminho conforme sua arquitetura!
|
||||
|
|
@ -28,35 +31,49 @@ AES_KEY = getattr(DB_SETTINGS, "aeskey", None)
|
|||
UPLOAD_DIR = Path(os.environ.get("STORAGE", "./storage"))
|
||||
|
||||
|
||||
def _save_file_from_base64(base64_content: str, file_name: str) -> str:
|
||||
# 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) -> str:
|
||||
"""
|
||||
Decodifica o Base64, salva o arquivo no disco e retorna o caminho/URL do arquivo salvo.
|
||||
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 de uploads existe
|
||||
# Garante que o diretório base de uploads existe
|
||||
UPLOAD_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Define o caminho completo do arquivo
|
||||
file_path = UPLOAD_DIR / file_name
|
||||
# --- 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
|
||||
|
||||
try:
|
||||
# Decodificação Base64
|
||||
# Decodifica o Base64
|
||||
file_bytes = base64.b64decode(base64_content)
|
||||
|
||||
# Escrita do arquivo em disco (modo binário 'wb')
|
||||
# Grava o arquivo em disco
|
||||
with open(file_path, "wb") as f:
|
||||
f.write(file_bytes)
|
||||
|
||||
# Retorna o caminho onde o arquivo foi salvo (Este será o valor salvo no campo 'url' do banco)
|
||||
# Retorna o caminho completo do arquivo salvo
|
||||
return str(file_path)
|
||||
|
||||
except base64.binascii.Error:
|
||||
# Erro específico para conteúdo Base64 inválido
|
||||
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:
|
||||
# Outros erros de I/O ou sistema
|
||||
raise Exception(f"Erro inesperado ao salvar arquivo '{file_name}': {e}")
|
||||
|
||||
|
||||
|
|
@ -157,9 +174,10 @@ class SaveMultipleRepository:
|
|||
file_url_path = None
|
||||
|
||||
if base64_content and doc.nome_documento:
|
||||
# 1. Decodifica e salva o Base64 em disco
|
||||
file_name = doc.nome_documento
|
||||
file_url_path = _save_file_from_base64(base64_content, file_name)
|
||||
file_url_path = _save_file_from_base64(
|
||||
base64_content, file_name, new_ato_id
|
||||
)
|
||||
|
||||
# 2. Atribui o caminho do arquivo salvo (ou None, se não foi enviado) ao campo 'url' do banco
|
||||
doc_data["url"] = file_url_path
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue