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