dsh/go_blog:feat/avatar-unified-upload
main
头像上传从此与文章附件共用同一个统一上传引擎(files 表 + SHA-256 内容寻址存储),type='avatars',公开下载链接改为 /uploads/avatars/<哈希>(沿用原有 avatars/ 目录与路由,前端 /uploads/avatars/ + 返回名拼接,零改动)。
type='avatars'
/uploads/avatars/<哈希>
/uploads/avatars/
saveUploadedFile
stored_name
<uid>.jpg
models.FileTypeAvatar
avatars
Avatar
FileTypeAvatar = "avatars"
TestAvatarUploadRegistersFileRow
go build
go vet
/uploads/avatars/<文件名>
- 提取共享上传引擎 saveUploadedFile(handlers/attachment.go): 内容 SHA-256 寻址写入 + 磁盘去重 + files 表登记,供附件/头像共用 - UploadAvatar 改用该引擎:处理后 JPEG 以哈希命名存储,登记 models.FileTypeAvatar('avatars')记录;用户 Avatar 字段 = 哈希, 公开链接 /uploads/avatars/<哈希>(沿用原有 avatars/ 目录与路由) - 更换头像时:旧登记行软删除;仅当无其他 files 记录或用户引用时 删除旧磁盘文件(与附件一致的引用计数语义) - 既有头像安全测试断言从 <uid>.jpg 改为 64 位哈希; 新增 TestAvatarUploadRegistersFileRow 覆盖登记/磁盘/替换清理全流程
No dependencies set.
The note is not visible to the blocked user.
变更概述
头像上传从此与文章附件共用同一个统一上传引擎(files 表 + SHA-256 内容寻址存储),
type='avatars',公开下载链接改为/uploads/avatars/<哈希>(沿用原有 avatars/ 目录与路由,前端/uploads/avatars/+ 返回名拼接,零改动)。saveUploadedFile—— 确保目录存在、按stored_name(内容 SHA-256)磁盘去重写入、登记 files 行;附件上传改走该引擎(行为不变)<uid>.jpg),登记models.FileTypeAvatar(avatars)记录(uploader_id/文件名/mime=image/jpeg/category=image);用户Avatar字段与会话头像改为哈希FileTypeAvatar = "avatars"验证
<uid>.jpg更新为 64 位哈希TestAvatarUploadRegistersFileRow:登记行(type=avatars/哈希/归属者)、用户字段、磁盘文件内容与哈希一致、更换时旧行软删+旧文件清理,全流程断言go build/go vet/ 全量测试通过兼容性说明
<uid>.jpg)不受影响:首次更换头像时按引用计数清理/uploads/avatars/<文件名>;新文件名为哈希(无扩展名,静态服务按内容嗅探 Content-Type)