1616share_api = APIRouter (prefix = "/share" , tags = ["分享" ])
1717
1818
19- async def validate_file_size (file : UploadFile , max_size : int ):
20- if file .size > max_size :
19+ async def validate_file_size (file : UploadFile , max_size : int ) -> int :
20+ size = file .size
21+ if size is None :
22+ # 读取流计算大小,保持指针复位
23+ await file .seek (0 , 2 )
24+ size = file .file .tell ()
25+ await file .seek (0 )
26+ if size > max_size :
2127 max_size_mb = max_size / (1024 * 1024 )
2228 raise HTTPException (
2329 status_code = 403 , detail = f"大小超过限制,最大为{ max_size_mb :.2f} MB"
2430 )
31+ return size
2532
2633
2734async def create_file_code (code , ** kwargs ):
@@ -63,7 +70,7 @@ async def share_file(
6370 file : UploadFile = File (...),
6471 ip : str = Depends (ip_limit ["upload" ]),
6572):
66- await validate_file_size (file , settings .uploadSize )
73+ file_size = await validate_file_size (file , settings .uploadSize )
6774 if expire_style not in settings .expireStyle :
6875 raise HTTPException (status_code = 400 , detail = "过期时间类型错误" )
6976 expired_at , expired_count , used_count , code = await get_expire_info (expire_value , expire_style )
@@ -76,7 +83,7 @@ async def share_file(
7683 suffix = suffix ,
7784 uuid_file_name = uuid_file_name ,
7885 file_path = path ,
79- size = file . size ,
86+ size = file_size ,
8087 expired_at = expired_at ,
8188 expired_count = expired_count ,
8289 used_count = used_count ,
@@ -141,6 +148,7 @@ async def download_file(key: str, code: str, ip: str = Depends(ip_limit["error"]
141148 file_storage : FileStorageInterface = storages [settings .file_storage ]()
142149 if await get_select_token (code ) != key :
143150 ip_limit ["error" ].add_ip (ip )
151+ raise HTTPException (status_code = 403 , detail = "下载鉴权失败" )
144152 has , file_code = await get_code_file_by_code (code , False )
145153 if not has :
146154 return APIResponse (code = 404 , detail = "文件不存在" )
0 commit comments