diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index e936fa183..4bb6956f2 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -1,5 +1,13 @@ import logging from typing import Optional +import base64 +import io + + +from fastapi import APIRouter, Depends, HTTPException, Request, status +from fastapi.responses import Response, StreamingResponse, FileResponse +from pydantic import BaseModel + from open_webui.models.auths import Auths from open_webui.models.groups import Groups @@ -21,9 +29,8 @@ from open_webui.socket.main import ( get_user_active_status, ) from open_webui.constants import ERROR_MESSAGES -from open_webui.env import SRC_LOG_LEVELS -from fastapi import APIRouter, Depends, HTTPException, Request, status -from pydantic import BaseModel +from open_webui.env import SRC_LOG_LEVELS, STATIC_DIR + from open_webui.utils.auth import get_admin_user, get_password_hash, get_verified_user from open_webui.utils.access_control import get_permissions, has_permission @@ -329,6 +336,43 @@ async def get_user_by_id(user_id: str, user=Depends(get_verified_user)): ) +############################ +# GetUserProfileImageById +############################ + + +@router.get("/{user_id}/profile/image") +async def get_user_profile_image_by_id(user_id: str, user=Depends(get_verified_user)): + user = Users.get_user_by_id(user_id) + if user: + if user.profile_image_url: + # check if it's url or base64 + if user.profile_image_url.startswith("http"): + return Response( + status_code=status.HTTP_302_FOUND, + headers={"Location": user.profile_image_url}, + ) + elif user.profile_image_url.startswith("data:image"): + try: + header, base64_data = user.profile_image_url.split(",", 1) + image_data = base64.b64decode(base64_data) + image_buffer = io.BytesIO(image_data) + + return StreamingResponse( + image_buffer, + media_type="image/png", + headers={"Content-Disposition": "inline; filename=image.png"}, + ) + except Exception as e: + pass + return FileResponse(f"{STATIC_DIR}/user.png") + else: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=ERROR_MESSAGES.USER_NOT_FOUND, + ) + + ############################ # GetUserActiveStatusById ############################ diff --git a/static/static/user.png b/static/static/user.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdc70d159cfb0a032bec208e3775ab82755b299 GIT binary patch literal 7858 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 VHCIdTv4bX~Jzf1=);T3K0RUf+u+abj literal 0 HcmV?d00001 diff --git a/static/user.png b/static/user.png index 2771e7286684e0935f952ef671dfe1f75f422256..7bdc70d159cfb0a032bec208e3775ab82755b299 100644 GIT binary patch literal 7858 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 VHCIdTv4bX~Jzf1=);T3K0RUf+u+abj literal 6037 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 DD=>iK