--- name: 调整 COS 图片存储路径结构 overview: 将 COS 图片对象键从 {userID}/{uuid.png} 改为 {衣物UUID}/{userID}/{uuid.png}(uuid/userid/图片 三层结构),同步调整临时文件保存目录保持一致。 todos: - id: adjust-cos-path content: 修改 upload.go 的 FileSaveTmpBytes 签名(userID 改为 subDir)与 clothes.go 的 processImageAsync(subDir/cosKey 三层结构) status: completed - id: verify-build content: 执行 go build ./... 验证编译通过 status: completed dependencies: - adjust-cos-path --- ## 用户需求 修改 COS 图片的存储位置,将当前的对象键与本地临时目录结构从 `{userID}/{uuid.png}` 两层改为 `{衣物UUID}/{userID}/{uuid.png}` 三层(即用户表述的「uuid/userid/图片」)。 ## 核心变更 - 抠图结果图片在 COS 上的对象键、以及后端本地临时文件目录,统一调整为 `{衣物UUID}/{userID}/{图片文件名}`。 - 衣物详情返回的 `processed_image` 字段仍存该 COS 对象键,前端获取图片 URL 的链路不变。 ## 影响范围 - 仅涉及图片上传落盘与 COS 对象键拼接,不影响上传/抠图/分类/额度等其它业务逻辑。 ## 技术方案 ### 现状 - `internal/service/clothes.go` 的 `processImageAsync`(约 137-145 行)当前生成: - `processedName := genUUID() + ".png"` - `cosKey := fmt.Sprintf("%d/%s", userID, processedName)`,即 `{userID}/{uuid.png}`。 - `pkg/upload/upload.go` 的 `FileSaveTmpBytes(ctx, data, fileName, userID)` 当前把临时文件保存到 `TmpSavePath/{userID}/{fileName}`。 - `FileUploadCos(ctx, cosKey)` 以同一个 `cosKey` 作为本地相对路径与 COS 对象键,因此只要 `cosKey` 结构变了,本地读取与 COS 上传会同步适配。 ### 修改点 #### 1. `pkg/upload/upload.go` — `FileSaveTmpBytes` - 将第 4 个参数 `userID int64` 改为 `subDir string`。 - 目录拼接由 `filepath.Join(TmpSavePath, fmt.Sprint(userID))` 改为 `filepath.Join(TmpSavePath, subDir)`。 - 函数职责从「按 userID 建目录」泛化为「按调用方传入的子目录建目录」,保持通用。 #### 2. `internal/service/clothes.go` — `processImageAsync` - 新增 `subDir := fmt.Sprintf("%s/%d", clothesUUID, userID)`。 - 保存调用改为 `upload.FileSaveTmpBytes(ctx, processedData, processedName, subDir)`。 - `cosKey := fmt.Sprintf("%s/%s", subDir, processedName)`,最终结构为 `{clothesUUID}/{userID}/{uuid.png}`。 - 同步更新该处「对象键含 userID 前缀」的注释,改为三层结构说明。 ### 关键设计 - `FileUploadCos` 与 `GetCosUrl` 的签名、逻辑均不变,它们以 `cosKey` 为输入自动适配新结构,改动面最小。 - `FileSaveTmpBytes` 仅 `clothes.go` 一处调用点,修改签名无连锁影响。 ### 注意事项 - 旧数据兼容:历史 `processed_image` 中存的是旧两层 key,新代码下 `GetCosUrl` 会拼出 COS 上不存在的对象路径。联调阶段建议清库重传;如需兼容旧数据,需另做数据迁移,本次不处理。 - 验证:改动后执行 `go build ./...` 确保编译通过。