{"record":{"id":"a8841adaf0b18544","repo":"abpframework/abp","slug":"blob-args-blobname-already-exists-in-container","errorCode":null,"errorMessage":"Blob '{args.BlobName}' already exists in container '{containerName}'. Set OverrideExisting to true to overwrite.","messagePattern":"Blob '(.+?)' already exists in container '(.+?)'\\. Set OverrideExisting to true to overwrite\\.","errorType":"exception","errorClass":"BlobAlreadyExistsException","httpStatus":null,"severity":"error","filePath":"framework/src/Volo.Abp.BlobStoring.Bunny/Volo/Abp/BlobStoring/Bunny/BunnyBlobProvider.cs","lineNumber":39,"sourceCode":"    {\n        BunnyBlobNameCalculator = bunnyBlobNameCalculator;\n        BlobNormalizeNamingService = blobNormalizeNamingService;\n        BunnyClientFactory = bunnyClientFactory;\n    }\n\n    public async override Task SaveAsync(BlobProviderSaveArgs args)\n    {\n        var configuration = args.Configuration.GetBunnyConfiguration();\n        var containerName = GetContainerName(args);\n        var blobName = BunnyBlobNameCalculator.Calculate(args);\n\n        await ValidateContainerExistsAsync(containerName, configuration);\n\n        var bunnyStorage = await GetBunnyCDNStorageAsync(args);\n\n        if (!args.OverrideExisting && await BlobExistsAsync(bunnyStorage, containerName, blobName))\n        {\n            throw new BlobAlreadyExistsException(\n                $\"Blob '{args.BlobName}' already exists in container '{containerName}'. \" +\n                $\"Set {nameof(args.OverrideExisting)} to true to overwrite.\");\n        }\n\n        using var memoryStream = new MemoryStream();\n        await args.BlobStream.CopyToAsync(memoryStream);\n        memoryStream.Position = 0;\n\n        await bunnyStorage.UploadAsync(memoryStream, $\"{containerName}/{blobName}\");\n    }\n\n    public async override Task<bool> DeleteAsync(BlobProviderDeleteArgs args)\n    {\n        var blobName = BunnyBlobNameCalculator.Calculate(args);\n        var containerName = GetContainerName(args);\n        var bunnyStorage = await GetBunnyCDNStorageAsync(args);\n\n        if (!await BlobExistsAsync(bunnyStorage, containerName, blobName))","sourceCodeStart":21,"sourceCodeEnd":57,"githubUrl":"https://github.com/abpframework/abp/blob/7ed43b1931b9df46a50c0c59148a18645641d0df/framework/src/Volo.Abp.BlobStoring.Bunny/Volo/Abp/BlobStoring/Bunny/BunnyBlobProvider.cs#L21-L57","documentation":"Thrown by BunnyBlobProvider.SaveAsync when OverrideExisting is false and BlobExistsAsync confirms an object already exists at {containerName}/{blobName} in the Bunny storage zone. The check runs after the storage zone is validated and the BunnyCDNStorage client is obtained, but before the stream is copied and uploaded.","triggerScenarios":"Saving a blob via the Bunny provider where the calculated path already exists and OverrideExisting is false. The existence check lists storage objects in the blob's directory and matches on FullPath.","commonSituations":"Re-saving a stable-key blob, retrying an upload that already completed, concurrent producers racing for the same path.","solutions":["Pass overrideExisting: true to overwrite the existing object.","Use a unique blob name per save.","Call ExistsAsync beforehand and branch accordingly.","Delete the existing object first if the key must be reused without overwrite semantics."],"exampleFix":"// before\nawait container.SaveAsync(key, stream);\n\n// after\nawait container.SaveAsync(key, stream, overrideExisting: true);","handlingStrategy":"validation","validationCode":"if (await container.ExistsAsync(blobName))\n{\n    await container.SaveAsync(blobName, stream, overrideExisting: true);\n    return;\n}\nawait container.SaveAsync(blobName, stream);","typeGuard":"bool willConflict = !args.OverrideExisting && await container.ExistsAsync(blobName);","tryCatchPattern":"try { await container.SaveAsync(blobName, stream); }\ncatch (BlobAlreadyExistsException)\n{ await container.SaveAsync(blobName, stream, overrideExisting: true); }","preventionTips":["Pass OverrideExisting when updating.","Use unique keys for append-only uploads.","Remember Bunny streams are buffered into a MemoryStream before upload."],"tags":["blob-storage","bunny","save","conflict","abp"],"backgroundTag":null,"analyzedSha":"7ed43b1931b9df46a50c0c59148a18645641d0df","analyzedAt":"2026-08-13T16:26:11.351Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}