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"
|
|
) |