Skip to content

对话框上传文件显示 Error: Upload failed: 403 #1642

Description

@kosmo888

问题描述

在聊天对话框通过附件按钮上传文件时,UI 显示 Error: Upload failed: 403

复现步骤

  1. 打开任意聊天会话
  2. 点击输入框旁的附件按钮(或拖拽文件到输入区)
  3. 选择文件上传
  4. 观察到错误提示 "Upload failed: 403"

根因分析

聊天对话框上传文件调用的是 POST /uploadpackages/client/src/stores/hermes/chat.ts:175)。

该路由在 packages/server/src/routes/index.ts:69 被注册为受保护路由,经过两层中间件可能导致 403:

1. requireUserJwt 中间件 (middleware/user-auth.ts:190)

  • /uploadisProtectedHttpPath() 中被列为受保护路径(line 108)
  • 用户状态不是 active(被禁用) → 返回 403(line 210-213)

2. resolveUserProfile 中间件 (middleware/user-auth.ts:241)

  • 客户端在 chat.ts:174 始终发送 X-Hermes-Profile header
  • 用户没有该 profile 的访问权限 → 返回 403(line 254-257)

3. 错误消息被吞掉

  • 客户端 chat.ts:180throw new Error("Upload failed: 403")
  • 只显示 HTTP 状态码,不显示服务器返回的 body.error

相关文件

  • packages/client/src/stores/hermes/chat.ts (line 164-183) — 聊天上传逻辑
  • packages/server/src/middleware/user-auth.ts (line 104-108, 190-218, 241-262)
  • packages/server/src/routes/index.ts (line 69) — 路由注册
  • packages/server/src/controllers/upload.ts — 上传控制器
  • packages/server/src/routes/hermes/files.ts (line 224-288) — 文件管理上传(额外 requireSuperAdmin)

建议修复

  1. 客户端:解析并显示服务器返回的 body.error,而非仅状态码
  2. 服务端:评估 /uploadresolveUserProfile 是否需要
  3. 诊断:增加服务端日志,记录 403 时的具体原因(用户状态/profile权限/其他)

环境

Hermes Web UI v0.6.17

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions