3.1 KiB
3.1 KiB
name, overview, todos
| name | overview | todos | |||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 调整 COS 图片存储路径结构 | 将 COS 图片对象键从 {userID}/{uuid.png} 改为 {衣物UUID}/{userID}/{uuid.png}(uuid/userid/图片 三层结构),同步调整临时文件保存目录保持一致。 |
|
用户需求
修改 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 ./...确保编译通过。