Console Files upload page -> shared-media (visible in GIMP); GIMP /media rw

This commit is contained in:
2026-08-26 15:18:46 +10:00
parent 802def6a0b
commit 1cc159ef80
5 changed files with 111 additions and 2 deletions

View File

@@ -223,6 +223,67 @@ async def tool_embed(request: Request, tool_id: str) -> HTMLResponse:
return templates.TemplateResponse(request, "embed.html", ctx)
SHARED_DIR = Path(os.getenv("SHARED_DIR", "/shared-media"))
def _shared_files(username: str) -> list:
"""List this user's uploaded files in the shared-media folder (created on demand)."""
if not SHARED_DIR.is_dir():
return []
user_dir = SHARED_DIR / username
if not user_dir.is_dir():
return []
out = []
for f in sorted(user_dir.iterdir()):
if f.is_file():
out.append({"name": f.name, "size": f.stat().st_size})
return out
@app.get("/files", response_class=HTMLResponse)
async def files_page(request: Request) -> HTMLResponse:
user = await _current_user(request)
if user is None:
return RedirectResponse("/login", status_code=303)
return templates.TemplateResponse(
request, "files.html", {"user": user, "files": _shared_files(user.username)}
)
@app.post("/files/upload")
async def files_upload(request: Request, file: Annotated[UploadFile, File()]) -> HTMLResponse:
user = await _current_user(request)
if user is None:
return RedirectResponse("/login", status_code=303)
error = None
if not file or not file.filename:
error = "No file chosen."
else:
try:
name = Path(file.filename).name.lower()
# allow images + common docs (photos are the main use case)
if not name.endswith((".png", ".jpg", ".jpeg", ".gif", ".webp", ".bmp", ".svg", ".psd", ".xcf", ".pdf", ".txt", ".md")):
error = f"File type not allowed: {file.filename}"
else:
SHARED_DIR.mkdir(exist_ok=True)
user_dir = SHARED_DIR / user.username
user_dir.mkdir(exist_ok=True)
data = await file.read()
if len(data) > 50 * 1024 * 1024:
error = "File too large (max 50 MB)."
else:
(user_dir / file.filename).write_bytes(data)
except Exception as exc: # noqa: BLE001
logger.warning("files upload failed", exc_info=True)
error = f"Upload failed: {exc}"
return templates.TemplateResponse(
request, "files.html",
{"user": user, "files": _shared_files(user.username),
"error": error, "ok": error is None and file and file.filename},
)
@app.get("/admin", response_class=HTMLResponse)
async def admin_panel(request: Request) -> HTMLResponse:
user = await _current_user(request)