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.BucketView on GitHub (pinned to 3136500ef3)
Solutions
- Verify CloudflareR2 config: Bucket, endpoint (https://<account>.r2.cloudflarestorage.com), AccessKey, SecretAccessKey
- Confirm the R2 API token has Object Read & Write permission for the bucket
- Check the wrapped err text: SignatureDoesNotMatch -> wrong secret; AccessDenied -> token lacks delete permission; DNS/timeout -> network issue
- After fixing config, restart the server so the credentials are reloaded
- 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
- Rotate R2 tokens centrally and redeploy/reload config on rotation
- Give the token Object Read & Write on the target bucket only
- Use the full endpoint https://<account-id>.r2.cloudflarestorage.com
- Treat delete as idempotent: if the object is already gone, the delete is a success
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
- function client.DeleteObjects() failed, err:
- function client.ListObjectsV2() failed, err:
- function client.ListObjectsV2() failed, err:
- function file.Open() failed, err:
- unknown error
AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31).
Data as JSON: /api/errors/6a8ba60918a6852f.
Report an issue: GitHub.