37 lines
1.3 KiB
Python
37 lines
1.3 KiB
Python
"""
|
|
存储层模块 (storage)
|
|
模块: 服务端 / 存储层
|
|
输入: 已校验的密文卷目录 + 元数据
|
|
输出: 最终存储目录
|
|
|
|
零知识 + 零合并: 只存卷, 不做任何拼接/合并, 服务端无密钥。
|
|
卷目录整体 move 到日期/transfer_id 目录 (transfer_id 唯一, 无同名冲突)。
|
|
"""
|
|
|
|
import shutil
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
from task_manager import TaskManager
|
|
|
|
|
|
class Storage:
|
|
def __init__(self, tasks: TaskManager, storage_root: str | Path) -> None:
|
|
self.tasks = tasks
|
|
self.storage_root = Path(storage_root)
|
|
|
|
def store_chunks(self, transfer_id: str, chunk_dir: Path, user_id: str) -> Path:
|
|
"""卷目录 -> 用户目录/日期/transfer_id (整体 move, 返回目标目录路径)
|
|
|
|
每用户独立目录 (user_id 已过注册校验: 3-32 位字母数字/下划线, 无路径风险)。
|
|
注意: 目标目录不能预创建, 否则 shutil.move 会嵌套成 dst/dst/。
|
|
"""
|
|
user_dir = self.storage_root / user_id
|
|
day_dir = user_dir / datetime.now().strftime("%Y-%m-%d")
|
|
final_dir = day_dir / transfer_id
|
|
if final_dir.exists():
|
|
raise OSError(f"存储目录已存在: {final_dir}")
|
|
day_dir.mkdir(parents=True, exist_ok=True)
|
|
shutil.move(str(chunk_dir), str(final_dir))
|
|
return final_dir
|