scene-detection / module /file_manager.py
jslmmfboom-coder
Fix paddlepaddle version to 2.6.2
e16aadc
Raw
History Blame Contribute Delete
2.75 kB
import os
import json
from datetime import datetime
from module.config import HISTORY_BASE_DIR, SUPPORTED_EXTENSIONS
def validate_username(username):
"""验证用户名合法性(非空、无非法字符、长度限制)"""
if not username or not username.strip():
raise ValueError('用户名不能为空')
username = username.strip()
invalid_chars = '<>:"/\\|?*'
for char in invalid_chars:
if char in username:
raise ValueError(f"用户名包含非法字符: '{char}'")
if len(username) > 50:
raise ValueError('用户名长度不能超过50个字符')
return username
def get_user_dir(username):
"""获取用户目录路径,若不存在则自动创建"""
user_dir = os.path.join(HISTORY_BASE_DIR, username)
os.makedirs(user_dir, exist_ok=True)
return user_dir
def load_metadata(user_dir):
"""从用户目录加载元数据JSON,文件不存在或损坏时返回空结构"""
metadata_path = os.path.join(user_dir, 'metadata.json')
if os.path.exists(metadata_path):
try:
with open(metadata_path, 'r', encoding='utf-8') as f:
return json.load(f)
except (json.JSONDecodeError, IOError):
pass
return {'images': []}
def save_metadata(user_dir, metadata):
"""将元数据JSON写入用户目录"""
metadata_path = os.path.join(user_dir, 'metadata.json')
with open(metadata_path, 'w', encoding='utf-8') as f:
json.dump(metadata, f, ensure_ascii=False, indent=2)
def generate_image_filename(original_name):
"""生成带时间戳的唯一文件名,格式:时间戳_原始文件名"""
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S_%f')
name, ext = os.path.splitext(original_name)
if ext.lower() not in SUPPORTED_EXTENSIONS:
ext = '.jpg'
return f'{timestamp}_{name}{ext}'
def save_uploaded_file(file_data, original_name, user_dir):
"""将上传的文件数据保存到用户目录,返回保存路径"""
filename = generate_image_filename(original_name)
save_path = os.path.join(user_dir, filename)
with open(save_path, 'wb') as f:
f.write(file_data)
return save_path
def delete_file(path):
"""删除指定路径的文件"""
if os.path.exists(path):
os.remove(path)
def get_history_images(user_dir):
"""扫描用户目录下所有支持格式的图片,返回按文件名排序的路径列表"""
images = []
if not os.path.exists(user_dir):
return images
for fname in sorted(os.listdir(user_dir)):
ext = os.path.splitext(fname)[1].lower()
if ext in SUPPORTED_EXTENSIONS:
images.append(os.path.join(user_dir, fname))
return images