feat(media): support external https image urls for entities

Allow entities to use full https:// URLs as their image path
Validate external URLs to prevent http://, data:, or credentials
Update API responses and frontend components to handle external sources
This commit is contained in:
2026-05-11 23:21:34 +08:00
parent 929c148c56
commit 8caa95e78e
6 changed files with 74 additions and 8 deletions

View File

@@ -379,7 +379,7 @@
- 物品图标
- 栖息地
- 上传图片只支持 `png``jpg/jpeg``webp``gif`
- 上传图片由服务端保存到受控上传目录,不接受任意外部 URL也不信任客户端传入的最终文件路径。
- 上传图片由服务端保存到受控上传目录,不信任客户端传入的最终文件路径;实体当前图片也可引用完整的 `https://` 外部图片 URL但不接受 `http://``data:``javascript:` 或带用户名 / 密码的 URL
- 上传路径由服务端按实体类型、实体展示名称和时间戳生成,格式示例:
- `items/甜蜜蜜/20260501002000.png`
- `pokemon/Pikachu/20260501002000.png`
@@ -395,7 +395,8 @@
- `byte_size`
- `created_by_user_id`
- `created_at`
- 实体表保存当前显示图片的相对路径;历史上传记录不会因为切换当前图片而删除。
- 实体表保存当前显示图片引用:上传图片相对路径、受支持静态资源路径或完整 `https://` 外部图片 URL;历史上传记录不会因为切换当前图片而删除。
- 公共实体 API 返回图片时包含当前图片引用 `path` 和可直接展示的 `url`;完整外部 URL 的 `path``url` 相同,不再拼接受控上传或静态资源域名。
- 公共 API 对外返回图片上传历史只包含:`id``path``url``uploadedAt` 和上传者必要署名 `uploadedBy`;不返回 `entity_name`、原始文件名、MIME、文件大小、服务器绝对文件路径或内部存储元数据。若编辑接口确需实体关联只能在受保护编辑接口返回 `entityId`
- 图片上传本身不直接改变实体内容;用户仍需保存实体编辑表单后,当前图片选择才成为实体行为并写入现有编辑审计。
- Docker 运行时上传目录必须使用 volume 持久化,避免重新 build 后丢失用户上传图片。