接入minio[ci][0.2.6]
All checks were successful
CI / docker-ci (push) Successful in 3m14s

This commit is contained in:
2026-01-16 15:13:57 +08:00
parent 45005fcc92
commit 6b0be35832
7 changed files with 226 additions and 24 deletions

View File

@@ -23,6 +23,37 @@ from .es_connect import (
from PIL import Image
def _image_ref_to_url(request, image_ref: str) -> str:
s = str(image_ref or '').strip()
if not s:
return ''
if not s.startswith('minio:'):
return ''
object_name = s[len('minio:'):].lstrip('/')
if not object_name:
return ''
try:
from minio_storage.minio_connect import presigned_get_url
return presigned_get_url(object_name, expires_seconds=8 * 60 * 60)
except Exception:
return ''
def _attach_image_urls(request, items):
out = []
for it in list(items or []):
try:
d = dict(it or {})
except Exception:
continue
d['image_url'] = _image_ref_to_url(request, d.get('image', ''))
out.append(d)
return out
@require_http_methods(["GET", "POST"])
@csrf_exempt
def init_index(request):
@@ -59,7 +90,7 @@ def search(request):
return JsonResponse({"status": "error", "message": "搜索关键词不能为空"}, status=400)
results = search_data(query)
return JsonResponse({"status": "success", "data": results})
return JsonResponse({"status": "success", "data": _attach_image_urls(request, results)})
except Exception as e:
return JsonResponse({"status": "error", "message": str(e)}, status=500)
@@ -73,7 +104,7 @@ def fuzzy_search(request):
return JsonResponse({"status": "error", "message": "搜索关键词不能为空"}, status=400)
results = search_by_any_field(keyword)
return JsonResponse({"status": "success", "data": results})
return JsonResponse({"status": "success", "data": _attach_image_urls(request, results)})
except Exception as e:
return JsonResponse({"status": "error", "message": str(e)}, status=500)
@@ -82,7 +113,7 @@ def get_all_data(request):
"""获取所有数据"""
try:
results = search_all()
return JsonResponse({"status": "success", "data": results})
return JsonResponse({"status": "success", "data": _attach_image_urls(request, results)})
except Exception as e:
return JsonResponse({"status": "error", "message": str(e)}, status=500)
@@ -176,7 +207,9 @@ def get_data(request, doc_id):
try:
result = get_by_id(doc_id)
if result:
return JsonResponse({"status": "success", "data": result})
wrapped = dict(result)
wrapped['image_url'] = _image_ref_to_url(request, wrapped.get('image', ''))
return JsonResponse({"status": "success", "data": wrapped})
else:
return JsonResponse({"status": "error", "message": "数据不存在"}, status=404)
except Exception as e:
@@ -473,29 +506,45 @@ def confirm(request):
return JsonResponse({"status": "error", "message": "数据不能为空"}, status=400)
ensure_type_in_list(edited.get("数据类型"))
final_image_rel = image_rel
try:
if image_rel:
images_dir = os.path.join(settings.MEDIA_ROOT, "images")
os.makedirs(images_dir, exist_ok=True)
src_abs = os.path.join(settings.MEDIA_ROOT, image_rel)
base = os.path.splitext(os.path.basename(image_rel))[0]
webp_name = base + ".webp"
webp_abs = os.path.join(images_dir, webp_name)
image_ref_to_store = ""
temp_files_to_delete = []
if image_rel:
images_dir = os.path.join(settings.MEDIA_ROOT, "images")
os.makedirs(images_dir, exist_ok=True)
src_abs = os.path.join(settings.MEDIA_ROOT, image_rel)
if not os.path.isfile(src_abs):
return JsonResponse({"status": "error", "message": "图片文件不存在"}, status=400)
webp_name = f"{uuid.uuid4().hex}.webp"
webp_abs = os.path.join(images_dir, webp_name)
try:
with Image.open(src_abs) as im:
if im.mode in ("RGBA", "LA", "P"):
im = im.convert("RGBA")
else:
im = im.convert("RGB")
im.save(webp_abs, format="WEBP", quality=80)
final_image_rel = f"images/{webp_name}"
except Exception:
final_image_rel = image_rel
except Exception:
try:
if os.path.isfile(webp_abs):
os.remove(webp_abs)
except Exception:
pass
return JsonResponse({"status": "error", "message": "图片转换WEBP失败"}, status=500)
try:
object_name = f"images/{webp_name}"
from minio_storage.minio_connect import upload_file
upload_file(webp_abs, object_name, content_type="image/webp")
image_ref_to_store = f"minio:{object_name}"
temp_files_to_delete.extend([src_abs, webp_abs])
except Exception as e:
return JsonResponse({"status": "error", "message": f"上传到MinIO失败: {e}"}, status=500)
to_store = {
"writer_id": str(request.session.get("user_id")),
"data": json_to_string(edited),
"image": final_image_rel,
"image": image_ref_to_store,
}
ok = insert_data(to_store)
@@ -503,10 +552,9 @@ def confirm(request):
return JsonResponse({"status": "error", "message": "写入ES失败"}, status=500)
try:
if image_rel and final_image_rel != image_rel:
orig_abs = os.path.join(settings.MEDIA_ROOT, image_rel)
if os.path.isfile(orig_abs):
os.remove(orig_abs)
for p in temp_files_to_delete:
if p and os.path.isfile(p):
os.remove(p)
except Exception:
pass