1.0.0
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
from minio import Minio
|
||||
from datetime import timedelta
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
import io
|
||||
import socket
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
import urllib3
|
||||
from urllib3.util import Retry, Timeout
|
||||
|
||||
load_dotenv()
|
||||
|
||||
MINIO_ENDPOINT = os.getenv("MINIO_ENDPOINT")
|
||||
MINIO_ACCESS_KEY = os.getenv("MINIO_ACCESS_KEY")
|
||||
MINIO_SECRET_KEY = os.getenv("MINIO_SECRET_KEY")
|
||||
MINIO_BUCKET = os.getenv("MINIO_BUCKET")
|
||||
SIGN_EXPIRE_MIN = int(os.getenv("SIGN_EXPIRE_MIN") or 60)
|
||||
LOCAL_UPLOAD_ROOT = Path(os.getenv("LOCAL_UPLOAD_ROOT", "local_uploads"))
|
||||
LOCAL_FILE_URL_BASE = os.getenv("LOCAL_FILE_URL_BASE")
|
||||
LOCAL_UPLOAD_ROOT.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
http_client = urllib3.PoolManager(
|
||||
timeout=Timeout(connect=2.0, read=5.0),
|
||||
retries=Retry(total=1, connect=1, read=1, status=1, backoff_factor=0.2),
|
||||
)
|
||||
|
||||
mc = Minio(
|
||||
MINIO_ENDPOINT,
|
||||
access_key=MINIO_ACCESS_KEY,
|
||||
secret_key=MINIO_SECRET_KEY,
|
||||
secure=False,
|
||||
http_client=http_client,
|
||||
)
|
||||
|
||||
|
||||
def get_url(file_path: str) -> str:
|
||||
bucket = MINIO_BUCKET
|
||||
full_object_path = file_path
|
||||
try:
|
||||
mc.stat_object(bucket, full_object_path)
|
||||
url = mc.presigned_get_object(bucket, full_object_path, expires=timedelta(minutes=SIGN_EXPIRE_MIN))
|
||||
return url
|
||||
except Exception as err:
|
||||
print(f"generate url error: {err}")
|
||||
local_path = LOCAL_UPLOAD_ROOT / file_path
|
||||
if local_path.exists():
|
||||
if LOCAL_FILE_URL_BASE:
|
||||
return LOCAL_FILE_URL_BASE.rstrip('/') + '/' + file_path
|
||||
host = os.getenv('SERVER_HOST') or '127.0.0.1'
|
||||
if host == '0.0.0.0':
|
||||
try:
|
||||
host = socket.gethostbyname(socket.gethostname())
|
||||
except Exception:
|
||||
host = '127.0.0.1'
|
||||
port = os.getenv('SERVER_PORT') or '8000'
|
||||
return f"http://{host}:{port}/static/{file_path}"
|
||||
return f"http://{MINIO_ENDPOINT}/{bucket}/{full_object_path}"
|
||||
|
||||
|
||||
def put_file(object_path: str, data: bytes, size: int):
|
||||
bucket = MINIO_BUCKET
|
||||
try:
|
||||
bio = io.BytesIO(data)
|
||||
mc.put_object(bucket, object_path, bio, length=size)
|
||||
return {'storage': 'minio', 'path': object_path}
|
||||
except Exception as e:
|
||||
print(f"minio put_file error: {e}")
|
||||
local_path = LOCAL_UPLOAD_ROOT / object_path
|
||||
local_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
with open(local_path, 'wb') as f:
|
||||
f.write(data)
|
||||
print(f"local fallback stored {local_path}")
|
||||
return {'storage': 'local', 'path': str(local_path)}
|
||||
|
||||
|
||||
def remove_prefix(prefix: str):
|
||||
bucket = MINIO_BUCKET
|
||||
try:
|
||||
objects = mc.list_objects(bucket, prefix=prefix, recursive=True)
|
||||
for obj in objects:
|
||||
try:
|
||||
mc.remove_object(bucket, obj.object_name)
|
||||
except Exception as e:
|
||||
print(f"failed remove object {obj.object_name}: {e}")
|
||||
except Exception as e:
|
||||
print(f"minio remove_prefix error: {e}")
|
||||
local_prefix = LOCAL_UPLOAD_ROOT / prefix
|
||||
if local_prefix.exists():
|
||||
try:
|
||||
shutil.rmtree(local_prefix)
|
||||
except Exception as e:
|
||||
print(f"local remove_prefix error: {e}")
|
||||
Reference in New Issue
Block a user