diff --git a/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts b/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts
index 08976db2b0..adcbe6077f 100644
--- a/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts
+++ b/packages/backend/src/server/api/mastodon/MastodonApiServerService.ts
@@ -236,14 +236,20 @@ export class MastodonApiServerService {
 			}
 		});
 
-		fastify.patch('/v1/accounts/update_credentials', { preHandler: upload.none() }, async (_request, reply) => {
+		fastify.patch('/v1/accounts/update_credentials', { preHandler: upload.single('file') }, async (_request, reply) => {
 			const BASE_URL = `${_request.protocol}://${_request.hostname}`;
 			const accessTokens = _request.headers.authorization;
 			const client = getClient(BASE_URL, accessTokens); // we are using this here, because in private mode some info isnt
 			// displayed without being logged in
 			try {
-				const data = await client.updateCredentials(_request.body!);
-				reply.send(convertAccount(data.data));
+				const multipartData = await _request.file;
+				if (!multipartData) {
+					const data = await client.updateCredentials(_request.body!);
+					reply.send(convertAccount(data.data));
+				} else {
+					const data = await client.updateCredentials(_request.body!, multipartData);
+					reply.send(convertAccount(data.data));
+				}
 			} catch (e: any) {
 				/* console.error(e); */
 				reply.code(401).send(e.response.data);
diff --git a/packages/megalodon/src/megalodon.ts b/packages/megalodon/src/megalodon.ts
index 19cd5c5551..b293254772 100644
--- a/packages/megalodon/src/megalodon.ts
+++ b/packages/megalodon/src/megalodon.ts
@@ -149,7 +149,7 @@ export interface MegalodonInterface {
       language?: string
     }
     fields_attributes?: Array<{ name: string; value: string }>
-  }): Promise<Response<Entity.Account>>
+  }, file?: any): Promise<Response<Entity.Account>>
   /**
    * View information about a profile.
    *
diff --git a/packages/megalodon/src/misskey.ts b/packages/megalodon/src/misskey.ts
index 5640ce19b1..b800df04d5 100644
--- a/packages/megalodon/src/misskey.ts
+++ b/packages/megalodon/src/misskey.ts
@@ -220,47 +220,77 @@ export default class Misskey implements MegalodonInterface {
       language?: string
     } | null
     fields_attributes?: Array<{ name: string; value: string }>
-  }): Promise<Response<Entity.Account>> {
+  }, file?: any): Promise<Response<Entity.Account>> {
     let params = {}
-    if (options) {
-      if (options.bot !== undefined) {
-        params = Object.assign(params, {
-          isBot: options.bot
-        })
-      }
-      if (options.display_name) {
-        params = Object.assign(params, {
-          name: options.display_name
-        })
-      }
-      if (options.note) {
-        params = Object.assign(params, {
-          description: options.note
-        })
-      }
-      if (options.locked !== undefined) {
-        params = Object.assign(params, {
-          isLocked: options.locked
-        })
-      }
-      if (options.source) {
-        if (options.source.language) {
+    if (!file) {
+      if (options) {
+        if (options.bot !== undefined) {
           params = Object.assign(params, {
-            lang: options.source.language
+            isBot: options.bot
           })
         }
-        if (options.source.sensitive) {
+        if (options.display_name) {
           params = Object.assign(params, {
-            alwaysMarkNsfw: options.source.sensitive
+            name: options.display_name
           })
         }
+        if (options.note) {
+          params = Object.assign(params, {
+            description: options.note
+          })
+        }
+        if (options.locked !== undefined) {
+          params = Object.assign(params, {
+            isLocked: options.locked
+          })
+        }
+        if (options.source) {
+          if (options.source.language) {
+            params = Object.assign(params, {
+              lang: options.source.language
+            })
+          }
+          if (options.source.sensitive) {
+            params = Object.assign(params, {
+              alwaysMarkNsfw: options.source.sensitive
+            })
+          }
+        }
       }
-    }
-    return this.client.post<MisskeyAPI.Entity.UserDetail>('/api/i/update', params).then(res => {
-      return Object.assign(res, {
-        data: MisskeyAPI.Converter.userDetail(res.data)
+      return this.client.post<MisskeyAPI.Entity.UserDetail>('/api/i/update', params).then(res => {
+        return Object.assign(res, {
+          data: MisskeyAPI.Converter.userDetail(res.data)
+        })
       })
-    })
+    } else {
+      const formData = new FormData()
+      formData.append('file', fs.createReadStream(file.path), {
+        contentType: file.mimetype,
+      });
+      if (file.originalname != null && file.originalname !== "file") formData.append("name", file.originalname);
+      let headers: { [key: string]: string } = {}
+      if (typeof formData.getHeaders === 'function') {
+        headers = formData.getHeaders()
+      }
+      await this.client
+        .post<MisskeyAPI.Entity.File>('/api/drive/files/create', formData, headers)
+        .then(res => {
+          if (file.name === "header") {
+            params = Object.assign(params, {
+              bannerId: res.data.id
+            })
+          } else if (file.name === "avatar") {
+            params = Object.assign(params, {
+              avatarId: res.data.id
+            })
+          }
+        })
+      return this.client.post<MisskeyAPI.Entity.UserDetail>('/api/i/update', params).then(res => {
+        return Object.assign(res, {
+          data: MisskeyAPI.Converter.userDetail(res.data)
+        })
+      })
+    }
   }
 
   /**