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

  1. Check the wrapped err suffix for the COS error code (e.g. NoSuchKey vs AccessDenied)
  2. Verify PathPrefix concatenation matches how the file was uploaded (PathPrefix + "/" + key)
  3. Grant the API key cos:DeleteObject permission in CAM
  4. 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

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


AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31). Data as JSON: /api/errors/2b008d092628152d. Report an issue: GitHub.