Skip to content

Commit e854eb0

Browse files
committed
fix: 自动清理过期的chunk
1 parent c1966b3 commit e854eb0

File tree

3 files changed

+12
-14
lines changed

3 files changed

+12
-14
lines changed

apps/base/models.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ class UploadChunk(models.Model):
5151
file_name = fields.CharField(max_length=255)
5252
created_at = fields.DatetimeField(auto_now_add=True)
5353
completed = fields.BooleanField(default=False)
54-
actual_size = fields.IntField(null=True) # 实际接收的分片大小
5554

5655

5756
class KeyValue(Model):

apps/base/views.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -266,13 +266,14 @@ async def upload_chunk(
266266
detail=f"分片大小超过声明值: 最大 {chunk_info.chunk_size}, 实际 {chunk_size}"
267267
)
268268

269-
# 计算已上传的实际总大小(防止绕过前端限制
270-
uploaded_chunks_list = await UploadChunk.filter(
269+
# 计算已上传分片数,校验累计大小不超限(用分片数 * chunk_size 估算
270+
uploaded_count = await UploadChunk.filter(
271271
upload_id=upload_id,
272272
completed=True
273-
).all()
274-
uploaded_size = sum(c.actual_size for c in uploaded_chunks_list if c.actual_size)
275-
if uploaded_size + chunk_size > settings.uploadSize:
273+
).count()
274+
# 已上传分片的最大可能大小 + 当前分片
275+
max_uploaded_size = uploaded_count * chunk_info.chunk_size + chunk_size
276+
if max_uploaded_size > settings.uploadSize:
276277
max_size_mb = settings.uploadSize / (1024 * 1024)
277278
raise HTTPException(
278279
status_code=403,
@@ -291,7 +292,7 @@ async def upload_chunk(
291292
except Exception as e:
292293
raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR, detail=f"分片保存失败: {str(e)}")
293294

294-
# 更新或创建分片记录(保存成功后再记录,包含实际大小
295+
# 更新或创建分片记录(保存成功后再记录)
295296
await UploadChunk.update_or_create(
296297
upload_id=upload_id,
297298
chunk_index=chunk_index,
@@ -301,8 +302,7 @@ async def upload_chunk(
301302
'file_size': chunk_info.file_size,
302303
'total_chunks': chunk_info.total_chunks,
303304
'chunk_size': chunk_info.chunk_size,
304-
'file_name': chunk_info.file_name,
305-
'actual_size': chunk_size
305+
'file_name': chunk_info.file_name
306306
}
307307
)
308308
return APIResponse(detail={"chunk_hash": chunk_hash})
@@ -372,9 +372,9 @@ async def complete_upload(upload_id: str, data: CompleteUploadModel, ip: str = D
372372
if len(completed_chunks_list) != chunk_info.total_chunks:
373373
raise HTTPException(status.HTTP_400_BAD_REQUEST, detail="分片不完整")
374374

375-
# 计算实际上传的总大小并校验
376-
actual_total_size = sum(c.actual_size for c in completed_chunks_list if c.actual_size)
377-
if actual_total_size > settings.uploadSize:
375+
# 用分片数 * chunk_size 校验最大可能大小
376+
max_total_size = len(completed_chunks_list) * chunk_info.chunk_size
377+
if max_total_size > settings.uploadSize:
378378
# 清理已上传的分片
379379
_, _, _, _, save_path = await get_chunk_file_path_name(chunk_info.file_name, upload_id)
380380
try:
@@ -401,7 +401,7 @@ async def complete_upload(upload_id: str, data: CompleteUploadModel, ip: str = D
401401
file_hash=file_hash, # 使用合并后计算的哈希
402402
is_chunked=True,
403403
upload_id=upload_id,
404-
size=actual_total_size, # 使用实际上传大小而非前端声明值
404+
size=chunk_info.file_size,
405405
expired_at=expired_at,
406406
expired_count=expired_count,
407407
used_count=used_count,

core/tasks.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ async def clean_incomplete_uploads():
5050
file_storage: FileStorageInterface = storages[settings.file_storage]()
5151
# 默认 24 小时未完成的上传视为过期
5252
expire_hours = getattr(settings, 'chunk_expire_hours', 24)
53-
5453
while True:
5554
try:
5655
expire_time = datetime.datetime.now() - datetime.timedelta(hours=expire_hours)

0 commit comments

Comments
 (0)