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'}
-
+
{:else if viewerType === 'synology'}
Synology Office 문서