diff --git a/app/routers/board.py b/app/routers/board.py
index e108bfd..e2784c2 100644
--- a/app/routers/board.py
+++ b/app/routers/board.py
@@ -926,6 +926,10 @@ async def view_page(request: Request, page_id: int):
return HTMLResponse("
Page not found
", status_code=404)
page = dict(row)
+ # For file-type pages (PDFs, images, etc.), use the dedicated file viewer
+ if page.get("content_format") == "file":
+ return _render_file_viewer(page, request)
+
ws = page.get("workspace", "")
parts = ws.split("/") if "/" in ws else ["", ""]
owner, repo = parts[0], parts[1] if len(parts) > 1 else ""
@@ -959,7 +963,8 @@ async def view_page(request: Request, page_id: int):
ws_id = p.replace("workspace_", "")
break
filename = fp_parts[-1] if fp_parts else page.get("title", "File")
- file_url = f"/api/files/{ws_id}/{filename}" if ws_id else ""
+ from urllib.parse import quote
+ file_url = f"/api/files/{ws_id}/{quote(filename, safe='')}" if ws_id else ""
page_data["file_url"] = file_url
page_data["file_mime"] = mime_type
page_data["file_size"] = file_size
@@ -1006,7 +1011,8 @@ def _render_file_viewer(page: dict, request: Request) -> HTMLResponse:
break
filename = parts[-1] if parts else title
- file_url = f"/api/files/{ws_id}/{filename}" if ws_id else ""
+ from urllib.parse import quote
+ file_url = f"/api/files/{ws_id}/{quote(filename, safe='')}" if ws_id else ""
# Determine viewer type
is_image = mime_type.startswith("image/")
diff --git a/app/routers/dashboard.py b/app/routers/dashboard.py
index f9517e1..29d5ccd 100644
--- a/app/routers/dashboard.py
+++ b/app/routers/dashboard.py
@@ -270,7 +270,8 @@ async def view_page_root(request: Request, page_id: int):
ws_id = p.replace("workspace_", "")
break
filename = fp_parts[-1] if fp_parts else page.get("title", "File")
- file_url = f"/api/files/{ws_id}/{filename}" if ws_id else ""
+ from urllib.parse import quote
+ file_url = f"/api/files/{ws_id}/{quote(filename, safe='')}" if ws_id else ""
page_data["file_url"] = file_url
page_data["file_mime"] = mime_type
page_data["file_size"] = file_size