{"record":{"id":"2b008d092628152d","repo":"flipped-aurora/gin-vue-admin","slug":"function-bucketmanager-delete-failed-err-2b008d","errorCode":null,"errorMessage":"function bucketManager.Delete() failed, err:","messagePattern":"function bucketManager\\.Delete\\(\\) failed, err:","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/utils/upload/tencent_cos.go","lineNumber":46,"sourceCode":"\tdefer f.Close() // 创建文件 defer 关闭\n\tfileKey := fmt.Sprintf(\"%d%s\", time.Now().Unix(), file.Filename)\n\n\t_, err := client.Object.Put(context.Background(), global.GVA_CONFIG.TencentCOS.PathPrefix+\"/\"+fileKey, f, nil)\n\tif err != nil {\n\t\tlogger.WithCtx(ctx).Mod(\"upload\").Err(err).Error(\"function client.Object.Put() failed\")\n\t\treturn \"\", \"\", errors.New(\"function client.Object.Put() failed, err:\" + err.Error())\n\t}\n\treturn global.GVA_CONFIG.TencentCOS.BaseURL + \"/\" + global.GVA_CONFIG.TencentCOS.PathPrefix + \"/\" + fileKey, fileKey, nil\n}\n\n// DeleteFile delete file form COS\nfunc (*TencentCOS) DeleteFile(ctx context.Context, key string) error {\n\tclient := NewClient()\n\tname := global.GVA_CONFIG.TencentCOS.PathPrefix + \"/\" + key\n\t_, err := client.Object.Delete(context.Background(), name)\n\tif err != nil {\n\t\tlogger.WithCtx(ctx).Mod(\"upload\").Err(err).Error(\"function bucketManager.Delete() failed\")\n\t\treturn errors.New(\"function bucketManager.Delete() failed, err:\" + err.Error())\n\t}\n\treturn nil\n}\n\n// Exists 通过 Object.Head 检查对象是否存在；404 统一降级为 (false, nil)。\nfunc (*TencentCOS) Exists(ctx context.Context, key string) (bool, error) {\n\tclient := NewClient()\n\tname := global.GVA_CONFIG.TencentCOS.PathPrefix + \"/\" + key\n\t_, err := client.Object.Head(ctx, name, nil)\n\tif err != nil {\n\t\tif cos.IsNotFoundError(err) {\n\t\t\treturn false, nil\n\t\t}\n\t\tlogger.WithCtx(ctx).Mod(\"upload\").Err(err).Error(\"function client.Object.Head() failed\")\n\t\treturn false, errors.New(\"function client.Object.Head() failed, err:\" + err.Error())\n\t}\n\treturn true, nil\n}","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/flipped-aurora/gin-vue-admin/blob/3136500ef380842b0eb6c4daa87c3f8a47fcf9e0/server/utils/upload/tencent_cos.go#L28-L64","documentation":"Wraps an error from the COS SDK's client.Object.Delete() in TencentCOS.DeleteFile(). Note the log/error text mistakenly says 'bucketManager.Delete()' (qiniu naming) but the actual failing call is COS Object.Delete.","triggerScenarios":"Calling DeleteFile(ctx, key) when Object.Delete fails: object does not exist with certain error semantics, permission denied, or network error.","commonSituations":"Key not found in the bucket (some COS setups return an error rather than 404 silently), wrong PathPrefix so the composed name points to a nonexistent object, insufficient CAM permissions for cos:DeleteObject, network failure.","solutions":["Check the wrapped err suffix for the COS error code (e.g. NoSuchKey vs AccessDenied)","Verify PathPrefix concatenation matches how the file was uploaded (PathPrefix + \"/\" + key)","Grant the API key cos:DeleteObject permission in CAM","Treat NoSuchKey as success in caller if idempotent deletion is desired"],"exampleFix":"// before\nerr := cos.DeleteFile(ctx, key) // fails if key missing\n// after\nif err := cos.DeleteFile(ctx, key); err != nil && !strings.Contains(err.Error(), \"NoSuchKey\") {\n    return err\n}","handlingStrategy":"try-catch","validationCode":"// pre-check existence for idempotency\nif ok, _ := cos.Exists(ctx, key); !ok {\n    return nil // nothing to delete\n}","typeGuard":null,"tryCatchPattern":"err := cos.DeleteFile(ctx, key)\nif err != nil {\n    if strings.Contains(err.Error(), \"NoSuchKey\") {\n        return nil // treat as success\n    }\n    return err\n}","preventionTips":["Ensure PathPrefix matches the upload-time prefix","Grant cos:DeleteObject in CAM","Treat missing-key as success for idempotent deletes"],"tags":["tencent-cos","delete","object-storage","permissions"],"backgroundTag":"object-storage-delete-failed","analyzedSha":"3136500ef380842b0eb6c4daa87c3f8a47fcf9e0","analyzedAt":"2026-08-31T13:50:02.721Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}