From b2dab5320e4d15a5891b4be28c904a9b223d641c Mon Sep 17 00:00:00 2001 From: Benny Date: Mon, 27 Feb 2023 20:45:20 +0100 Subject: [PATCH] =?UTF-8?q?avatar=20=E4=B8=8D=E7=94=A8base64?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- YYeTsFE | 2 +- yyetsweb/Mongo.py | 16 +++++----------- yyetsweb/handler.py | 31 +++++++++++++++++++------------ yyetsweb/server.py | 2 +- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/YYeTsFE b/YYeTsFE index e2a3426..d816233 160000 --- a/YYeTsFE +++ b/YYeTsFE @@ -1 +1 @@ -Subproject commit e2a3426462e3a37f406a2b6b0b81611b8fc5b1e4 +Subproject commit d816233cb2744d1be9001be88ed2fb0e7863896d diff --git a/yyetsweb/Mongo.py b/yyetsweb/Mongo.py index 347b9ac..3870635 100644 --- a/yyetsweb/Mongo.py +++ b/yyetsweb/Mongo.py @@ -74,13 +74,6 @@ class Mongo: def is_old_user(self, username: str) -> bool: return bool(self.db["users"].find_one({"username": username, "oldUser": True})) - @staticmethod - def b64_image(img): - if not img: - return "" - mime = filetype.guess_mime(img) or "image/jpeg" - return f"data:{mime};base64,{base64.b64encode(img).decode('utf-8')}" - class FakeMongoResource: pass @@ -198,7 +191,7 @@ class CommentMongoResource(CommentResource, Mongo): user = self.db["users"].find_one({"username": username}) or {} group = user.get("group", ["user"]) comment["group"] = group - comment["avatar"] = self.b64_image(user.get("avatar", b"")) + comment["hasAvatar"] = bool(user.get("avatar")) if username in whitelist: comment["group"].append("publisher") @@ -620,7 +613,7 @@ class ResourceMongoResource(ResourceResource, Mongo): "resourceID": comment_rid, "resourceName": d["data"]["info"]["cnname"], "origin": "comment", - "avatar": c["avatar"], + "hasAvatar": c["avatar"], } ) @@ -814,7 +807,7 @@ class UserMongoResource(UserResource, Mongo): projection = {"_id": False, "password": False} data = self.db["users"].find_one({"username": username}, projection) data.update(group=data.get("group", ["user"])) - data["avatar"] = self.b64_image(data.get("avatar", b"")) + data["hasAvatar"] = bool(data.pop("avatar", None)) return data def update_user_last(self, username: str, now_ip: str) -> None: @@ -877,7 +870,8 @@ class UserAvatarMongoResource(UserMongoResource, Mongo): def get_avatar(self, username): user = self.db["users"].find_one({"username": username}) img = user.get("avatar", b"") - return self.b64_image(img) + mime = filetype.guess_mime(img) + return {"image": img, "content_type": mime} class DoubanMongoResource(DoubanResource, Mongo): diff --git a/yyetsweb/handler.py b/yyetsweb/handler.py index 6c2a989..380d47b 100644 --- a/yyetsweb/handler.py +++ b/yyetsweb/handler.py @@ -239,29 +239,36 @@ class UserAvatarHandler(BaseHandler): # instance = UserMongoResource() @run_on_executor() - def avatar(self) -> dict: + def update_avatar(self): username = self.get_current_user() if not username: self.set_status(HTTPStatus.UNAUTHORIZED) self.clear_cookie("username") return {"message": "Please try to login"} - if self.request.method == "POST": - file = self.request.files["image"][0]['body'] - if len(file) > 10 * 1024 * 1024: - self.set_status(HTTPStatus.REQUEST_ENTITY_TOO_LARGE) - return {"message": "图片大小不可以超过10MB"} - return self.instance.add_avatar(username, file) - return self.instance.get_avatar(username) + file = self.request.files["image"][0]['body'] + if len(file) > 10 * 1024 * 1024: + self.set_status(HTTPStatus.REQUEST_ENTITY_TOO_LARGE) + return {"message": "图片大小不可以超过10MB"} + return self.instance.add_avatar(username, file) + + @run_on_executor() + def get_avatar(self, username): + data = self.instance.get_avatar(username) + if data["image"]: + self.set_header("Content-Type", data["content_type"]) + return data["image"] + self.set_status(HTTPStatus.NOT_FOUND) + return b"" @gen.coroutine - def post(self): - resp = yield self.avatar() + def post(self, _): + resp = yield self.update_avatar() self.write(resp) @gen.coroutine - def get(self): - resp = yield self.avatar() + def get(self, username): + resp = yield self.get_avatar(username) self.write(resp) diff --git a/yyetsweb/server.py b/yyetsweb/server.py index 1c63b20..4c7a354 100644 --- a/yyetsweb/server.py +++ b/yyetsweb/server.py @@ -52,7 +52,7 @@ class RunServer: (r'/api/top', TopHandler), (r'/api/like', LikeHandler), (r'/api/user', UserHandler), - (r'/api/user/avatar', UserAvatarHandler), + (r'/api/user/avatar/?(.*)', UserAvatarHandler), (r'/api/user/email', UserEmailHandler), (r'/api/name', NameHandler), (r'/api/comment', CommentHandler),