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> }