TOOGLE
ASP.NET Blob Azure - Others
Project type: ASP.NET Core Web App (Model-View-Controller)

appsettings.json________________________________________________________________

 "ConnectionStrings": {
   "AzureBlobStorage": "blobStorage>Security>Access Keys>Key1>Connection string"
 }

Program.cs________________________________________________________________
builder.Services.AddSingleton(x =>
{
    var connectionString = builder.Configuration.GetConnectionString("AzureBlobStorage");
    return new BlobServiceClient(connectionString);
});

HomeController.cs________________________________________________________________
using Azure.Storage.Blobs;
using Microsoft.AspNetCore.Mvc;
using Azure.Storage.Sas;
using Microsoft.Extensions.Configuration;
using Azure.Storage.Blobs.Models;

namespace BlobStorage.Controllers
{
    public class HomeController : Controller
    {
        private readonly BlobServiceClient _blobServiceClient;
        private readonly string _containerName;

        public HomeController(BlobServiceClient blobServiceClient, IConfiguration configuration)
        {
            _blobServiceClient = blobServiceClient;
            _containerName = configuration.GetConnectionString("ContainerName") ?? "defaultContainerName";
        }

        public async Task<IActionResult> Index()
        {
            var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
            var blobItems = containerClient.GetBlobsAsync();

            var files = new List<Azure.Storage.Blobs.Models.BlobItem>();

            await foreach (var blobItem in blobItems)
            {
                files.Add(blobItem);
            }

            return View(files.AsEnumerable());
        }

        [HttpPost("upload")]
        public async Task<IActionResult> UploadFile([FromForm] IFormFile file)
        {
            if (file == null || file.Length == 0)
                return BadRequest("invalid file.");

            try
            {
                var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
                await containerClient.CreateIfNotExistsAsync();

                var blobClient = containerClient.GetBlobClient(file.FileName);
                using var stream = file.OpenReadStream();
                await blobClient.UploadAsync(stream, true);

                TempData["Message"] = "Upload Success";
                TempData["MessageType"] = "success";
                return RedirectToAction("Index"); 
            }
            catch 
            {
                TempData["Message"] = "Upload Error";
                TempData["MessageType"] = "error";
                return RedirectToAction("Index");
            }
        }

        [HttpGet("download/{fileName}")]
        public async Task<IActionResult> DownloadFile(string fileName)
        {
            var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
            var blobClient = containerClient.GetBlobClient(fileName);

            if (!await blobClient.ExistsAsync())
                return NotFound("File not found");

            var download = await blobClient.DownloadAsync();
            return File(download.Value.Content, download.Value.ContentType, fileName);
        }

        [HttpPost("delete/{fileName}")]
        public async Task<IActionResult> DeleteFile(string fileName)
        {
            try
            {
                var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
                var blobClient = containerClient.GetBlobClient(fileName);

                Console.WriteLine($"Tentando deletar: {fileName}");

                var response = await blobClient.DeleteIfExistsAsync();

                if (response)
                {
                    TempData["Message"] = $"Arquivo '{fileName}' excluído com sucesso!";
                }
                else
                {
                    TempData["Message"] = $"Arquivo '{fileName}' não encontrado.";
                }

                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                TempData["Message"] = $"Erro ao excluir o arquivo: {ex.Message}";
                return RedirectToAction("Index");
            }
        }

        public async Task<IActionResult> GenerateThumbnail(string fileName)
        {
            var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
            var blobClient = containerClient.GetBlobClient(fileName);

            if (!await blobClient.ExistsAsync())
            {
                return NotFound("Arquivo não encontrado.");
            }

            var sasBuilder = new BlobSasBuilder
            {
                BlobContainerName = _containerName,
                BlobName = fileName,
                ExpiresOn = DateTimeOffset.UtcNow.AddHours(1)
            };
            sasBuilder.SetPermissions(BlobSasPermissions.Read);

            var sasUri = blobClient.GenerateSasUri(sasBuilder);

            return Redirect(sasUri.ToString());
        }

        [HttpGet("show/{fileName}")]
        public async Task<IActionResult> ShowImage(string fileName)
        {
            var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
            var blobClient = containerClient.GetBlobClient(fileName);

            if (!await blobClient.ExistsAsync())
                return NotFound("Imagem não encontrada.");

            var sasBuilder = new BlobSasBuilder
            {
                BlobContainerName = _containerName,
                BlobName = fileName,
                ExpiresOn = DateTimeOffset.UtcNow.AddHours(1) 
            };
            sasBuilder.SetPermissions(BlobSasPermissions.Read);

            var sasUri = blobClient.GenerateSasUri(sasBuilder);

            return Content($"<html><body><img src='{sasUri}' style='max-height:100%;'/></body></html>", "text/html");
        }

        [HttpPost("edit")]
        public async Task<IActionResult> EditName(string fileName, string newFileName)
        {
            try
            {
                var containerClient = _blobServiceClient.GetBlobContainerClient(_containerName);
                var sourceBlobClient = containerClient.GetBlobClient(fileName);
                var destinationBlobClient = containerClient.GetBlobClient(newFileName);

                // Verifica se o arquivo original existe
                if (!await sourceBlobClient.ExistsAsync())
                {
                    TempData["Message"] = $"Arquivo '{fileName}' não encontrado.";
                    return RedirectToAction("Index");
                }

                // Copia o arquivo para um novo blob
                await destinationBlobClient.StartCopyFromUriAsync(sourceBlobClient.Uri);

                // Aguarda a cópia ser concluída
                BlobProperties properties;
                do
                {
                    await Task.Delay(500);
                    properties = await destinationBlobClient.GetPropertiesAsync();
                } while (properties.CopyStatus == CopyStatus.Pending);

                if (properties.CopyStatus != CopyStatus.Success)
                {
                    TempData["Message"] = $"Erro ao copiar o arquivo '{fileName}'.";
                    return RedirectToAction("Index");
                }

                // Exclui o arquivo original
                await sourceBlobClient.DeleteIfExistsAsync();

                TempData["Message"] = $"Arquivo '{fileName}' renomeado para '{newFileName}' com sucesso!";
            }
            catch (Exception ex)
            {
                TempData["Message"] = $"Erro ao renomear o arquivo: {ex.Message}";
            }

            return RedirectToAction("Index");
        }
    }
}


index.cshtml________________________________________________________________
@using Azure.Storage.Blobs.Models

@{
    ViewData["Title"] = "Home Page";
    var message = TempData["Message"];
    var messageType = TempData["MessageType"];
}

<h2>Upload de Arquivo</h2>
<form asp-action="UploadFile" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button type="submit">Upload</button>
</form>

@if (message != null)
{
    <div class="alert alert-@messageType" role="alert">
        @message
    </div>
}

<h2>Arquivos Disponíveis</h2>

@if (Model != null && Model.Count > 0)
{
    <ul>
        @foreach (var file in Model)
        {
            <li>
                <img src="@Url.Action("GenerateThumbnail", new { fileName = file.Name })" alt="Miniatura" width="100" />

                <span>@file.Name</span>

                <a href="@Url.Action("DownloadFile", new { fileName = file.Name })">
                    <i class="bi bi-download"></i> Baixar
                </a>
                <form asp-action="DeleteFile" asp-route-fileName="@file.Name" method="post" style="display:inline;">
                    <button type="submit" style="background: none; border: none; color: red; cursor: pointer;">
                        <i class="bi bi-trash"></i> Excluir
                    </button>
                </form>
                <a href="@Url.Action("ShowImage", "Home", new { fileName = file.Name })" target="_blank">
                    <i class="bi bi-eye"></i> Visualizar
                </a>

                <form asp-action="EditName" method="post" style="display:inline;">
                    <input type="hidden" name="fileName" value="@file.Name" />
                    <input type="text" name="newFileName" placeholder="Novo nome">
                    <button type="submit">Renomear</button>
                </form>
            </li>
        }
    </ul>
}
else
{
    <p>Não há arquivos disponíveis.</p>
}