feat: 头像上传纳入统一上传引擎——files 表登记 type=avatars,链接 /uploads/avatars/哈希 #8

Merged
kevin merged 1 commits from dsh/go_blog:feat/avatar-unified-upload into main 2026-08-28 20:18:04 +08:00
Contributor

变更概述

头像上传从此与文章附件共用同一个统一上传引擎(files 表 + SHA-256 内容寻址存储),type='avatars',公开下载链接改为 /uploads/avatars/<哈希>(沿用原有 avatars/ 目录与路由,前端 /uploads/avatars/ + 返回名拼接,零改动)。

  • handlers/attachment.go:提取共享引擎 saveUploadedFile —— 确保目录存在、按 stored_name(内容 SHA-256)磁盘去重写入、登记 files 行;附件上传改走该引擎(行为不变)
  • handlers/profile.go UploadAvatar:处理后的 256x256 JPEG 以 SHA-256 哈希命名存储(不再用 <uid>.jpg),登记 models.FileTypeAvataravatars)记录(uploader_id/文件名/mime=image/jpeg/category=image);用户 Avatar 字段与会话头像改为哈希
  • 更换头像语义:旧登记行软删除;仅当无其他 files 记录或用户引用时才删除旧磁盘文件(与附件一致的引用计数,避免误删共享内容寻址文件)
  • models/file.go:新增 FileTypeAvatar = "avatars"

验证

  • 既有头像安全测试(非图片拒绝/规范化 JPEG/目录清洁)断言从 <uid>.jpg 更新为 64 位哈希
  • 新增 TestAvatarUploadRegistersFileRow:登记行(type=avatars/哈希/归属者)、用户字段、磁盘文件内容与哈希一致、更换时旧行软删+旧文件清理,全流程断言
  • go build / go vet / 全量测试通过

兼容性说明

  • 存量头像文件名(<uid>.jpg)不受影响:首次更换头像时按引用计数清理
  • URL 仍是 /uploads/avatars/<文件名>;新文件名为哈希(无扩展名,静态服务按内容嗅探 Content-Type)
## 变更概述 头像上传从此与文章附件共用**同一个统一上传引擎**(files 表 + SHA-256 内容寻址存储),`type='avatars'`,公开下载链接改为 `/uploads/avatars/<哈希>`(沿用原有 avatars/ 目录与路由,前端 `/uploads/avatars/` + 返回名拼接,零改动)。 - **handlers/attachment.go**:提取共享引擎 `saveUploadedFile` —— 确保目录存在、按 `stored_name`(内容 SHA-256)磁盘去重写入、登记 files 行;附件上传改走该引擎(行为不变) - **handlers/profile.go UploadAvatar**:处理后的 256x256 JPEG 以 **SHA-256 哈希命名**存储(不再用 `<uid>.jpg`),登记 `models.FileTypeAvatar`(`avatars`)记录(uploader_id/文件名/mime=image/jpeg/category=image);用户 `Avatar` 字段与会话头像改为哈希 - **更换头像语义**:旧登记行软删除;仅当无其他 files 记录或用户引用时才删除旧磁盘文件(与附件一致的引用计数,避免误删共享内容寻址文件) - **models/file.go**:新增 `FileTypeAvatar = "avatars"` ## 验证 - 既有头像安全测试(非图片拒绝/规范化 JPEG/目录清洁)断言从 `<uid>.jpg` 更新为 64 位哈希 - 新增 `TestAvatarUploadRegistersFileRow`:登记行(type=avatars/哈希/归属者)、用户字段、磁盘文件内容与哈希一致、更换时旧行软删+旧文件清理,全流程断言 - `go build` / `go vet` / 全量测试通过 ## 兼容性说明 - 存量头像文件名(`<uid>.jpg`)不受影响:首次更换头像时按引用计数清理 - URL 仍是 `/uploads/avatars/<文件名>`;新文件名为哈希(无扩展名,静态服务按内容嗅探 Content-Type)
dsh added 1 commit 2026-08-28 20:14:04 +08:00
- 提取共享上传引擎 saveUploadedFile(handlers/attachment.go):
  内容 SHA-256 寻址写入 + 磁盘去重 + files 表登记,供附件/头像共用
- UploadAvatar 改用该引擎:处理后 JPEG 以哈希命名存储,登记
  models.FileTypeAvatar('avatars')记录;用户 Avatar 字段 = 哈希,
  公开链接 /uploads/avatars/<哈希>(沿用原有 avatars/ 目录与路由)
- 更换头像时:旧登记行软删除;仅当无其他 files 记录或用户引用时
  删除旧磁盘文件(与附件一致的引用计数语义)
- 既有头像安全测试断言从 <uid>.jpg 改为 64 位哈希;
  新增 TestAvatarUploadRegistersFileRow 覆盖登记/磁盘/替换清理全流程
kevin merged commit a3122b04a4 into main 2026-08-28 20:18:04 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kevin/go_blog#8