diff --git a/app/api/documents.py b/app/api/documents.py index 32d8515..bd4ba20 100644 --- a/app/api/documents.py +++ b/app/api/documents.py @@ -6,6 +6,7 @@ from pathlib import Path from typing import Annotated from fastapi import APIRouter, Depends, HTTPException, Query, UploadFile, status +from fastapi.responses import FileResponse from pydantic import BaseModel from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession @@ -160,6 +161,28 @@ async def get_document( return DocumentResponse.model_validate(doc) +@router.get("/{doc_id}/file") +async def get_document_file( + doc_id: int, + user: Annotated[User, Depends(get_current_user)], + session: Annotated[AsyncSession, Depends(get_session)], +): + """문서 원본 파일 서빙""" + doc = await session.get(Document, doc_id) + if not doc: + raise HTTPException(status_code=404, detail="문서를 찾을 수 없습니다") + + file_path = Path(settings.nas_mount_path) / doc.file_path + if not file_path.exists(): + raise HTTPException(status_code=404, detail="파일을 찾을 수 없습니다") + + return FileResponse( + path=str(file_path), + filename=file_path.name, + media_type=None, # 자동 감지 + ) + + @router.post("/", response_model=DocumentResponse, status_code=201) async def upload_document( file: UploadFile, diff --git a/frontend/src/routes/documents/[id]/+page.svelte b/frontend/src/routes/documents/[id]/+page.svelte index f5148fe..bea3497 100644 --- a/frontend/src/routes/documents/[id]/+page.svelte +++ b/frontend/src/routes/documents/[id]/+page.svelte @@ -56,12 +56,12 @@ {:else if viewerType === 'pdf'} {:else if viewerType === 'image'} - {doc.title} + {doc.title} {:else if viewerType === 'synology'}

Synology Office 문서