File size: 1,434 Bytes
b4f2238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
"""
存储类定义

提供统一的文件存储类,供各模块使用.
"""

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