@@ -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 ,
0 commit comments