fc / apps /core /filesystem /storage.py
jun2024's picture
Upload 2241 files
b4f2238 verified
Raw History Blame Contribute Delete
1.43 kB
"""
存储类定义
提供统一的文件存储类,供各模块使用.
"""
from django.core.files.storage import FileSystemStorage
class KeepOriginalNameStorage(FileSystemStorage):
"""
自定义存储类,保持原文件名(包括括号等特殊字符)
如果文件名重复,添加序号而不是随机字符
"""
def generate_filename(self, filename: str) -> str: # type: ignore[override]
"""
重写 generate_filename,跳过 get_valid_filename 的清理
保持原始文件名不变
"""
import posixpath
# 不调用 get_valid_filename,直接使用原始文件名
# 只做基本的路径安全处理
filename = filename.replace("\\", "/")
filename = posixpath.basename(filename)
return filename
def get_available_name(self, name: str, max_length: int | None = None) -> str:
import os
# 如果文件不存在,直接返回原名
if not self.exists(name):
return name
# 文件存在,添加序号
dir_name = os.path.dirname(name)
base_name = os.path.basename(name)
stem, ext = os.path.splitext(base_name)
counter = 1
while True:
new_name = os.path.join(dir_name, f"{stem}_{counter}{ext}") if dir_name else f"{stem}_{counter}{ext}"
if not self.exists(new_name):
return new_name
counter += 1