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}",
|
"password": "${DB_PASSWORD}",
|
||||||
"aeskey": "${AES_KEY}",
|
"aeskey": "${AES_KEY}",
|
||||||
"storage": "${STORAGE}",
|
"storage": "${STORAGE}",
|
||||||
|
"group_size": "${GROUP_SIZE}",
|
||||||
"charset": "utf8mb4",
|
"charset": "utf8mb4",
|
||||||
"pool": {
|
"pool": {
|
||||||
"pre_ping": true,
|
"pre_ping": true,
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,9 @@ from pathlib import Path
|
||||||
# Configuração da Chave AES
|
# Configuração da Chave AES
|
||||||
DB_SETTINGS = get_database_settings()
|
DB_SETTINGS = get_database_settings()
|
||||||
AES_KEY = getattr(DB_SETTINGS, "aeskey", None)
|
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 ---
|
# --- CONFIGURAÇÃO DE DIRETÓRIO DE UPLOAD ---
|
||||||
# **IMPORTANTE:** Configure este caminho conforme sua arquitetura!
|
# **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"))
|
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)
|
UPLOAD_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
# Define o caminho completo do arquivo
|
# --- NOVO BLOCO: define a faixa de agrupamento ---
|
||||||
file_path = UPLOAD_DIR / file_name
|
# 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:
|
try:
|
||||||
# Decodificação Base64
|
# Decodifica o Base64
|
||||||
file_bytes = base64.b64decode(base64_content)
|
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:
|
with open(file_path, "wb") as f:
|
||||||
f.write(file_bytes)
|
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)
|
return str(file_path)
|
||||||
|
|
||||||
except base64.binascii.Error:
|
except base64.binascii.Error:
|
||||||
# Erro específico para conteúdo Base64 inválido
|
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
||||||
detail=f"O conteúdo do arquivo '{file_name}' não é um Base64 válido.",
|
detail=f"O conteúdo do arquivo '{file_name}' não é um Base64 válido.",
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
# Outros erros de I/O ou sistema
|
|
||||||
raise Exception(f"Erro inesperado ao salvar arquivo '{file_name}': {e}")
|
raise Exception(f"Erro inesperado ao salvar arquivo '{file_name}': {e}")
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -157,9 +174,10 @@ class SaveMultipleRepository:
|
||||||
file_url_path = None
|
file_url_path = None
|
||||||
|
|
||||||
if base64_content and doc.nome_documento:
|
if base64_content and doc.nome_documento:
|
||||||
# 1. Decodifica e salva o Base64 em disco
|
|
||||||
file_name = doc.nome_documento
|
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
|
# 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
|
doc_data["url"] = file_url_path
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue