31 lines
		
	
	
		
			1015 B
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			1015 B
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os
 | |
| from fastapi import FastAPI, HTTPException, Path, APIRouter
 | |
| from fastapi.responses import FileResponse
 | |
| from service.file_service import UPLOAD_ROOT
 | |
| 
 | |
| router = APIRouter(
 | |
|     prefix="/api/file",
 | |
|     tags=["文件管理"]
 | |
| )
 | |
| 
 | |
| 
 | |
| @router.get("/download/{relative_path:path}", summary="下载文件")
 | |
| async def download_file(
 | |
|         relative_path: str = Path(..., description="文件的相对路径")
 | |
| ):
 | |
|     file_path = os.path.abspath(os.path.join(UPLOAD_ROOT, relative_path))
 | |
| 
 | |
|     if not os.path.exists(file_path):
 | |
|         raise HTTPException(status_code=404, detail=f"文件不存在: {file_path}")
 | |
| 
 | |
|     if not os.path.isfile(file_path):
 | |
|         raise HTTPException(status_code=400, detail="路径指向的不是文件")
 | |
| 
 | |
|     if not file_path.startswith(os.path.abspath(UPLOAD_ROOT)):
 | |
|         raise HTTPException(status_code=403, detail="无权访问该文件")
 | |
| 
 | |
|     return FileResponse(
 | |
|         path=file_path,
 | |
|         filename=os.path.basename(file_path),
 | |
|         media_type="application/octet-stream"
 | |
|     ) |