flipped-aurora/gin-vue-admin · error
function bucketManager.Delete() failed, err:
Error message
function bucketManager.Delete() failed, err:
What it means
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.
Source
Thrown at server/utils/upload/tencent_cos.go:46
defer f.Close() // 创建文件 defer 关闭
fileKey := fmt.Sprintf("%d%s", time.Now().Unix(), file.Filename)
_, err := client.Object.Put(context.Background(), global.GVA_CONFIG.TencentCOS.PathPrefix+"/"+fileKey, f, nil)
if err != nil {
logger.WithCtx(ctx).Mod("upload").Err(err).Error("function client.Object.Put() failed")
return "", "", errors.New("function client.Object.Put() failed, err:" + err.Error())
}
return global.GVA_CONFIG.TencentCOS.BaseURL + "/" + global.GVA_CONFIG.TencentCOS.PathPrefix + "/" + fileKey, fileKey, nil
}
// DeleteFile delete file form COS
func (*TencentCOS) DeleteFile(ctx context.Context, key string) error {
client := NewClient()
name := global.GVA_CONFIG.TencentCOS.PathPrefix + "/" + key
_, err := client.Object.Delete(context.Background(), name)
if err != nil {
logger.WithCtx(ctx).Mod("upload").Err(err).Error("function bucketManager.Delete() failed")
return errors.New("function bucketManager.Delete() failed, err:" + err.Error())
}
return nil
}
// Exists 通过 Object.Head 检查对象是否存在;404 统一降级为 (false, nil)。
func (*TencentCOS) Exists(ctx context.Context, key string) (bool, error) {
client := NewClient()
name := global.GVA_CONFIG.TencentCOS.PathPrefix + "/" + key
_, err := client.Object.Head(ctx, name, nil)
if err != nil {
if cos.IsNotFoundError(err) {
return false, nil
}
logger.WithCtx(ctx).Mod("upload").Err(err).Error("function client.Object.Head() failed")
return false, errors.New("function client.Object.Head() failed, err:" + err.Error())
}
return true, nil
}View on GitHub (pinned to 3136500ef3)
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
Example fix
// before
err := cos.DeleteFile(ctx, key) // fails if key missing
// after
if err := cos.DeleteFile(ctx, key); err != nil && !strings.Contains(err.Error(), "NoSuchKey") {
return err
} Defensive patterns
Strategy: try-catch
Validate before calling
// pre-check existence for idempotency
if ok, _ := cos.Exists(ctx, key); !ok {
return nil // nothing to delete
} Try / catch
err := cos.DeleteFile(ctx, key)
if err != nil {
if strings.Contains(err.Error(), "NoSuchKey") {
return nil // treat as success
}
return err
} Prevention
- Ensure PathPrefix matches the upload-time prefix
- Grant cos:DeleteObject in CAM
- Treat missing-key as success for idempotent deletes
When it happens
Trigger: Calling DeleteFile(ctx, key) when Object.Delete fails: object does not exist with certain error semantics, permission denied, or network error.
Common situations: 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.
Related errors
- function client.Object.Head() failed, err:
- function bucketManager.Delete() failed, err:
- function client.Object.Put() failed, err:
- function client.Object.DeleteMulti() failed, err:
- function client.Bucket.Get() failed, err:
AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31).
Data as JSON: /api/errors/2b008d092628152d.
Report an issue: GitHub.