Console Files upload page -> shared-media (visible in GIMP); GIMP /media rw
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user