Skip to content

Commit e87bcfc

Browse files
committed
fix: #407
1 parent e80be56 commit e87bcfc

File tree

3 files changed

+58
-56
lines changed

3 files changed

+58
-56
lines changed

apps/admin/views.py

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from apps.base.models import FileCodes, KeyValue
1818
from apps.admin.dependencies import create_token
1919
from core.settings import settings
20+
from core.utils import get_now
2021

2122
admin_api = APIRouter(prefix="/admin", tags=["管理"])
2223

@@ -37,16 +38,13 @@ async def dashboard(admin: bool = Depends(admin_required)):
3738
all_codes = await FileCodes.all()
3839
all_size = str(sum([code.size for code in all_codes]))
3940
sys_start = await KeyValue.filter(key="sys_start").first()
40-
# 获取当前日期时间
41-
now = datetime.datetime.now()
41+
now = await get_now()
4242
today_start = now.replace(hour=0, minute=0, second=0, microsecond=0)
4343
yesterday_start = today_start - datetime.timedelta(days=1)
4444
yesterday_end = today_start - datetime.timedelta(microseconds=1)
45-
# 统计昨天一整天的记录数(从昨天0点到23:59:59)
4645
yesterday_codes = FileCodes.filter(
4746
created_at__gte=yesterday_start, created_at__lte=yesterday_end
4847
)
49-
# 统计今天到现在的记录数(从今天0点到现在)
5048
today_codes = FileCodes.filter(created_at__gte=today_start)
5149
return APIResponse(
5250
detail={
@@ -63,21 +61,21 @@ async def dashboard(admin: bool = Depends(admin_required)):
6361

6462
@admin_api.delete("/file/delete")
6563
async def file_delete(
66-
data: IDData,
67-
file_service: FileService = Depends(get_file_service),
68-
admin: bool = Depends(admin_required),
64+
data: IDData,
65+
file_service: FileService = Depends(get_file_service),
66+
admin: bool = Depends(admin_required),
6967
):
7068
await file_service.delete_file(data.id)
7169
return APIResponse()
7270

7371

7472
@admin_api.get("/file/list")
7573
async def file_list(
76-
page: int = 1,
77-
size: int = 10,
78-
keyword: str = "",
79-
file_service: FileService = Depends(get_file_service),
80-
admin: bool = Depends(admin_required),
74+
page: int = 1,
75+
size: int = 10,
76+
keyword: str = "",
77+
file_service: FileService = Depends(get_file_service),
78+
admin: bool = Depends(admin_required),
8179
):
8280
files, total = await file_service.list_files(page, size, keyword)
8381
return APIResponse(
@@ -92,17 +90,17 @@ async def file_list(
9290

9391
@admin_api.get("/config/get")
9492
async def get_config(
95-
config_service: ConfigService = Depends(get_config_service),
96-
admin: bool = Depends(admin_required),
93+
config_service: ConfigService = Depends(get_config_service),
94+
admin: bool = Depends(admin_required),
9795
):
9896
return APIResponse(detail=config_service.get_config())
9997

10098

10199
@admin_api.patch("/config/update")
102100
async def update_config(
103-
data: dict,
104-
config_service: ConfigService = Depends(get_config_service),
105-
admin: bool = Depends(admin_required),
101+
data: dict,
102+
config_service: ConfigService = Depends(get_config_service),
103+
admin: bool = Depends(admin_required),
106104
):
107105
data.pop("themesChoices")
108106
await config_service.update_config(data)
@@ -111,47 +109,47 @@ async def update_config(
111109

112110
@admin_api.get("/file/download")
113111
async def file_download(
114-
id: int,
115-
file_service: FileService = Depends(get_file_service),
116-
admin: bool = Depends(admin_required),
112+
id: int,
113+
file_service: FileService = Depends(get_file_service),
114+
admin: bool = Depends(admin_required),
117115
):
118116
file_content = await file_service.download_file(id)
119117
return file_content
120118

121119

122120
@admin_api.get("/local/lists")
123121
async def get_local_lists(
124-
local_file_service: LocalFileService = Depends(get_local_file_service),
125-
admin: bool = Depends(admin_required),
122+
local_file_service: LocalFileService = Depends(get_local_file_service),
123+
admin: bool = Depends(admin_required),
126124
):
127125
files = await local_file_service.list_files()
128126
return APIResponse(detail=files)
129127

130128

131129
@admin_api.delete("/local/delete")
132130
async def delete_local_file(
133-
item: DeleteItem,
134-
local_file_service: LocalFileService = Depends(get_local_file_service),
135-
admin: bool = Depends(admin_required),
131+
item: DeleteItem,
132+
local_file_service: LocalFileService = Depends(get_local_file_service),
133+
admin: bool = Depends(admin_required),
136134
):
137135
result = await local_file_service.delete_file(item.filename)
138136
return APIResponse(detail=result)
139137

140138

141139
@admin_api.post("/local/share")
142140
async def share_local_file(
143-
item: ShareItem,
144-
file_service: FileService = Depends(get_file_service),
145-
admin: bool = Depends(admin_required),
141+
item: ShareItem,
142+
file_service: FileService = Depends(get_file_service),
143+
admin: bool = Depends(admin_required),
146144
):
147145
share_info = await file_service.share_local_file(item)
148146
return APIResponse(detail=share_info)
149147

150148

151149
@admin_api.patch("/file/update")
152150
async def update_file(
153-
data: UpdateFileData,
154-
admin: bool = Depends(admin_required),
151+
data: UpdateFileData,
152+
admin: bool = Depends(admin_required),
155153
):
156154
file_code = await FileCodes.filter(id=data.id).first()
157155
if not file_code:
@@ -167,7 +165,11 @@ async def update_file(
167165
update_data["prefix"] = data.prefix
168166
if data.suffix is not None and data.suffix != file_code.suffix:
169167
update_data["suffix"] = data.suffix
170-
if data.expired_at is not None and data.expired_at != "" and data.expired_at != file_code.expired_at:
168+
if (
169+
data.expired_at is not None
170+
and data.expired_at != ""
171+
and data.expired_at != file_code.expired_at
172+
):
171173
update_data["expired_at"] = data.expired_at
172174
if data.expired_count is not None and data.expired_count != file_code.expired_count:
173175
update_data["expired_count"] = data.expired_count

apps/base/utils.py

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,41 +10,44 @@
1010
from apps.base.dependencies import IPRateLimit
1111
from apps.base.models import FileCodes
1212
from core.settings import settings
13-
from core.utils import get_random_num, get_random_string, max_save_times_desc, sanitize_filename
13+
from core.utils import (
14+
get_random_num,
15+
get_random_string,
16+
max_save_times_desc,
17+
sanitize_filename,
18+
get_now,
19+
)
1420

1521

1622
async def get_file_path_name(file: UploadFile) -> Tuple[str, str, str, str, str]:
17-
"""获取文件路径和文件名"""
18-
today = datetime.datetime.now()
19-
storage_path = settings.storage_path.strip("/") # 移除开头和结尾的斜杠
23+
today = await get_now()
24+
storage_path = settings.storage_path.strip("/")
2025
file_uuid = uuid.uuid4().hex
21-
# 一些客户端对非ASCII字符会进行编码,需要解码
22-
filename = await sanitize_filename(unquote(file.filename))
23-
# 使用 UUID 作为子目录名
26+
filename = await sanitize_filename(unquote(file.filename or ""))
2427
base_path = f"share/data/{today.strftime('%Y/%m/%d')}/{file_uuid}"
25-
# 如果设置了存储路径,将其添加到基础路径中
2628
path = f"{storage_path}/{base_path}" if storage_path else base_path
2729
prefix, suffix = os.path.splitext(filename)
28-
# 保持原始文件名
2930
save_path = f"{path}/{filename}"
3031
return path, suffix, prefix, filename, save_path
3132

3233

33-
async def get_chunk_file_path_name(file_name: str, upload_id: str) -> Tuple[str, str, str, str, str]:
34-
"""获取切片文件的路径和文件名"""
35-
today = datetime.datetime.now()
36-
storage_path = settings.storage_path.strip("/") # 移除开头和结尾的斜杠
34+
async def get_chunk_file_path_name(
35+
file_name: str, upload_id: str
36+
) -> Tuple[str, str, str, str, str]:
37+
today = await get_now()
38+
storage_path = settings.storage_path.strip("/")
3739
base_path = f"share/data/{today.strftime('%Y/%m/%d')}/{upload_id}"
3840
path = f"{storage_path}/{base_path}" if storage_path else base_path
3941
prefix, suffix = os.path.splitext(file_name)
4042
save_path = f"{path}/{prefix}{suffix}"
4143
return path, suffix, prefix, file_name, save_path
4244

4345

44-
async def get_expire_info(expire_value: int, expire_style: str) -> Tuple[Optional[datetime.datetime], int, int, str]:
45-
"""获取过期信息"""
46+
async def get_expire_info(
47+
expire_value: int, expire_style: str
48+
) -> Tuple[Optional[datetime.datetime], int, int, str]:
4649
expired_count, used_count = -1, 0
47-
now = datetime.datetime.now()
50+
now = await get_now()
4851
code = None
4952

5053
max_timedelta = (
@@ -64,7 +67,7 @@ async def get_expire_info(expire_value: int, expire_style: str) -> Tuple[Optiona
6467
"hour": lambda: now + datetime.timedelta(hours=expire_value),
6568
"minute": lambda: now + datetime.timedelta(minutes=expire_value),
6669
"count": lambda: (now + datetime.timedelta(days=1), expire_value),
67-
"forever": lambda: (None, None), # 修改这里
70+
"forever": lambda: (None, None),
6871
}
6972

7073
if expire_style in expire_styles:
@@ -74,7 +77,7 @@ async def get_expire_info(expire_value: int, expire_style: str) -> Tuple[Optiona
7477
if expire_style == "count":
7578
expired_count = extra
7679
elif expire_style == "forever":
77-
code = await get_random_code(style="string") # 移动到这里
80+
code = await get_random_code(style="string")
7881
else:
7982
expired_at = result
8083
if expired_at and expired_at - now > max_timedelta:
@@ -88,12 +91,11 @@ async def get_expire_info(expire_value: int, expire_style: str) -> Tuple[Optiona
8891
return expired_at, expired_count, used_count, code
8992

9093

91-
async def get_random_code(style="num") -> str:
92-
"""获取随机字符串"""
94+
async def get_random_code(style: str = "num") -> str:
9395
while True:
9496
code = await get_random_num() if style == "num" else await get_random_string()
9597
if not await FileCodes.filter(code=code).exists():
96-
return code
98+
return str(code)
9799

98100

99101
async def calculate_file_hash(file: UploadFile, chunk_size=1024 * 1024) -> str:

core/tasks.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,12 @@ async def delete_expire_files():
4646

4747

4848
async def clean_incomplete_uploads():
49-
"""清理超时未完成的分片上传"""
5049
file_storage: FileStorageInterface = storages[settings.file_storage]()
5150
expire_hours = getattr(settings, "chunk_expire_hours", 24)
5251
while True:
5352
try:
54-
expire_time = datetime.datetime.now() - datetime.timedelta(
55-
hours=expire_hours
56-
)
53+
now = await get_now()
54+
expire_time = now - datetime.timedelta(hours=expire_hours)
5755
expired_sessions = await UploadChunk.filter(
5856
chunk_index=-1, created_at__lt=expire_time
5957
).all()

0 commit comments

Comments
 (0)