Search code examples
c#azureasp.net-coreazure-blob-storage

How do I allow the overwriting of blobs from my ASP.NET Core application?


Users can upload images when a record is created, when you edit that record and try to upload new images there is an error of "This blob already exists". Is there a way that I can enable the overwriting of blobs with the same name in my application?

Here is my code that handles the update process.

It's important to note that I create three iterations of an image for the sake of the application so I have included the array that has that information.

CarController.cs

private readonly int[] sizeArray = new int[] { 700, 350, 150 };

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Car car)
{
    if (ModelState.IsValid)
    {
        //Create the Car
                _carService.InsertCar(car);

                //Get the ID of the newly created car
                int id = car.Id;

                //Define the container name for Azure Storage
                string strContainerName = "uploads";                               

                //Blob Client
                BlobServiceClient blobServiceClient = new BlobServiceClient(accessKey);
                BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(strContainerName);

                //Iterate over the array of image sizes
                foreach (var imageSize in sizeArray)
                {
                    try
                    {
                        //Pass image to image processor and save to the blob location
                        string fileName = "car/" + id + "/car-image-" + imageSize + ".jpg";
                        Stream returnStream = ProcessImage(imageSize, car);
                        containerClient.UploadBlob(fileName, returnStream);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }                   
                return RedirectToAction(nameof(Index));
            }            
            return View(car);
        }

Solution

  • I think you're using v12 client library.

    Then there is no blob overwriting method in container level, you should use Upload(Stream content, bool overwrite = false) method of the BlobClient. Sample code like below:

                BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
                BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(mycontainer);
                BlobClient blobClient = containerClient.GetBlobClient("blob_name");
    
                blobClient.Upload(your_stream, overwrite: true);