{"record":{"id":"5d0a21d0f0620824","repo":"flipped-aurora/gin-vue-admin","slug":"function-bucketmanager-delete-failed-err-5d0a21","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/qiniu.go","lineNumber":67,"sourceCode":"\t\treturn \"\", \"\", errors.New(\"function formUploader.Put() failed, err:\" + putErr.Error())\n\t}\n\treturn global.GVA_CONFIG.Qiniu.ImgPath + \"/\" + ret.Key, ret.Key, nil\n}\n\n//@author: [piexlmax](https://github.com/piexlmax)\n//@author: [ccfish86](https://github.com/ccfish86)\n//@author: [SliverHorn](https://github.com/SliverHorn)\n//@object: *Qiniu\n//@function: DeleteFile\n//@description: 删除文件\n//@param: key string\n//@return: error\n\nfunc (*Qiniu) DeleteFile(ctx context.Context, key string) error {\n\tbucketManager := newBucketManager()\n\tif err := bucketManager.Delete(global.GVA_CONFIG.Qiniu.Bucket, key); 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// newBucketManager 创建七牛 BucketManager 实例。\nfunc newBucketManager() *storage.BucketManager {\n\tmac := qbox.NewMac(global.GVA_CONFIG.Qiniu.AccessKey, global.GVA_CONFIG.Qiniu.SecretKey)\n\tcfg := qiniuConfig()\n\treturn storage.NewBucketManager(mac, cfg)\n}\n\n// Exists 检查对象是否存在，七牛 code 612（或 \"no such file\"）视为不存在。\nfunc (*Qiniu) Exists(ctx context.Context, key string) (bool, error) {\n\tbucketManager := newBucketManager()\n\tif _, err := bucketManager.Stat(global.GVA_CONFIG.Qiniu.Bucket, key); err != nil {\n\t\tmsg := err.Error()\n\t\t// 七牛 612 表示资源不存在\n\t\tif strings.Contains(msg, \"612\") || strings.Contains(msg, \"no such file\") || strings.Contains(msg, \"no such file or directory\") {","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/flipped-aurora/gin-vue-admin/blob/3136500ef380842b0eb6c4daa87c3f8a47fcf9e0/server/utils/upload/qiniu.go#L49-L85","documentation":"DeleteFile for Qiniu failed when calling bucketManager.Delete — the Qiniu Kodo API rejected the delete request for the given bucket/key. The qiniu-sdk-go returns an error for auth failure (bad AccessKey/SecretKey or signature), missing object in some flows, wrong bucket, or network problems; the message embeds that error text.","triggerScenarios":"Calling Qiniu.DeleteFile when bucketManager.Delete returns an error: invalid credentials/signature, bucket name wrong, key not found (579/612-style responses), or connectivity failure to the Qiniu RS API host.","commonSituations":"Rotated or mistyped access keys in config, deleting a key that was already removed or never existed, bucket/zone mismatch, egress blocked from server to Qiniu API hosts, stale keys after manual console deletion.","solutions":["Read the embedded err text — Qiniu returns specific codes (e.g. 631 no such bucket, 612 no such file) that identify the cause.","Verify qiniu access-key/secret-key and bucket name in config.yaml against the Qiniu console.","Treat 'no such file' as already-deleted if your flow allows idempotent deletes (check err code before surfacing as failure).","Check network egress to Qiniu RS endpoints (rs.qiniu.com or zone-specific).","Confirm the key passed in matches exactly what UploadFile returned (ret.Key), including timestamp prefix."],"exampleFix":"// before\nif err := bucketManager.Delete(global.GVA_CONFIG.Qiniu.Bucket, key); err != nil {\n    return errors.New(\"function bucketManager.Delete() failed, err:\" + err.Error())\n}\n// after — tolerate already-missing objects\nif err := bucketManager.Delete(global.GVA_CONFIG.Qiniu.Bucket, key); err != nil {\n    var e *storage.ErrorInfo\n    if errors.As(err, &e) && e.Code == 612 {\n        return nil // already deleted\n    }\n    return errors.New(\"function bucketManager.Delete() failed, err:\" + err.Error())\n}","handlingStrategy":"try-catch","validationCode":"if key == \"\" {\n    return errors.New(\"qiniu delete skipped: empty key\")\n}","typeGuard":null,"tryCatchPattern":"if err := q.DeleteFile(ctx, key); err != nil {\n    if strings.Contains(err.Error(), \"no such file\") {\n        logger.Warn(\"qiniu object already absent: %s\", key) // idempotent success\n        return nil\n    }\n    logger.Error(\"qiniu delete failed: %v\", err)\n    return fmt.Errorf(\"delete failed: %w\", err)\n}","preventionTips":["Store the exact key returned by UploadFile (ret.Key) so deletes target the right object.","Treat 'no such file' (612) as success for idempotent cleanup flows.","Verify Qiniu credentials after rotation; signature errors surface here.","Log and monitor delete failures to catch bucket/zone misconfiguration early."],"tags":["qiniu","delete","object-storage","auth"],"backgroundTag":"qiniu-delete-failed","analyzedSha":"3136500ef380842b0eb6c4daa87c3f8a47fcf9e0","analyzedAt":"2026-08-31T13:50:02.721Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}