flipped-aurora/gin-vue-admin · error

function client.DeleteObject() failed, err:

Error message

function client.DeleteObject() failed, err:

What it means

CloudflareR2.DeleteFile issues a DeleteObject call against the R2 (S3-compatible) endpoint; any SDK error from that call is wrapped in this message. The deletion API itself rejected the request — network, auth, or permission problem. Note DeleteObject is idempotent in S3 semantics; this error means the request failed, not that the key was missing.

Source

Thrown at server/utils/upload/cloudflare_r2.go:67

	return fmt.Sprintf("%s/%s", global.GVA_CONFIG.CloudflareR2.BaseURL, fileName), fileKey, nil
}

func (c *CloudflareR2) DeleteFile(ctx context.Context, key string) error {
	client, err := c.newR2Client()
	if err != nil {
		return err
	}
	filename := global.GVA_CONFIG.CloudflareR2.Path + "/" + key
	bucket := global.GVA_CONFIG.CloudflareR2.Bucket

	_, err = client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{
		Bucket: aws.String(bucket),
		Key:    aws.String(filename),
	})
	if err != nil {
		logger.WithCtx(ctx).Mod("upload").Err(err).Error("function client.DeleteObject() failed")
		return errors.New("function client.DeleteObject() failed, err:" + err.Error())
	}

	waiter := s3.NewObjectNotExistsWaiter(client)
	_ = waiter.Wait(context.TODO(), &s3.HeadObjectInput{
		Bucket: aws.String(bucket),
		Key:    aws.String(filename),
	}, 30*time.Second)

	return nil
}

// Exists 检查对象是否存在。404 统一降级为 (false, nil)。
func (c *CloudflareR2) Exists(ctx context.Context, key string) (bool, error) {
	client, err := c.newR2Client()
	if err != nil {
		return false, err
	}
	bucket := global.GVA_CONFIG.CloudflareR2.Bucket

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Verify CloudflareR2 config: Bucket, endpoint (https://<account>.r2.cloudflarestorage.com), AccessKey, SecretAccessKey
  2. Confirm the R2 API token has Object Read & Write permission for the bucket
  3. Check the wrapped err text: SignatureDoesNotMatch -> wrong secret; AccessDenied -> token lacks delete permission; DNS/timeout -> network issue
  4. After fixing config, restart the server so the credentials are reloaded
  5. Test with aws CLI --endpoint-url against the same bucket to isolate app vs. account issues

Example fix

// before
Endpoint: "https://r2.cloudflarestorage.com" // missing account id
// after
Endpoint: "https://<your-account-id>.r2.cloudflarestorage.com"
Defensive patterns

Strategy: retry

Validate before calling

if cfg.Bucket == "" || !strings.Contains(cfg.Endpoint, "r2.cloudflarestorage.com") {
    return errors.New("R2 endpoint/bucket misconfigured")
}

Type guard

null

Try / catch

err := uploader.DeleteFile(ctx, filename)
if err != nil {
    var re *smithy.OperationError
    if errors.As(err, &re) {
        // network-level: safe to retry, DeleteObject is idempotent
        return retry(3, func() error { return uploader.DeleteFile(ctx, filename) })
    }
    return err
}

Prevention

When it happens

Trigger: DeleteFile(ctx, filename) when: credentials invalid, endpoint/bucket wrong, network to the R2 endpoint fails, or the token lacks permission to delete objects in the bucket.

Common situations: Rotated R2 API token still cached in config, wrong bucket name in CloudflareR2.Bucket, custom endpoint missing the account ID, firewall/DNS preventing access to <account>.r2.cloudflarestorage.com, R2 service incident.

Related errors


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