E aí galera, tudo certo?
Hoje vou falar um pouco sobre Azure Storage, que nada mais é que um serviço que armazena dados na nuvem. Mais especificamente, vou falar sobre armazenamento de blobs(binary large objects), também chamado de armazenamento de objeto. Onde podemos armazenar textos ou qualquer tipo de dado binário, como um instalador ou um documento, por exemplo.
Um pouco mais sobre o armazenamento de Blob
Como dito anteriormente, esse cara serve pra armazenar dados na nuvem, que podem ser acessados posteriormente via HTTP ou HTTPS de onde você estiver; algumas das funções dele são: fornecer imagens/documentos diretamente para o navegador, streaming de áudio e vídeo, armazenar arquivos para acesso distribuído e armazenamento para backup.
Composição
O serviço do Blob consiste basicamente em três partes:
- Conta de armazenamento: O acesso aos dados armazenados é dado pela conta de armazenamento.
- Contêiners: Um contêiner é um agrupamento de Blobs, podemos compará-los à pastas. Uma conta de armazenamento pode ter vários contêiners.
- Blobs: Blobs são os arquivos propriamente ditos. Um contêiner pode ter vários blobs, que por sua vez podem ter três tipos: blobs de página, blobs de arquivo e blobs de anexo. Você pode ver mais sobre os blobs aqui.
Para acessar o blob “Doc1.pdf” via HTTP, fazemos a seguinte url:
suaconta.core.windows.net/documentos/Doc1.pdf
Implementação
Certo, com isso esclarecido, agora vamos colocar a mão na massa! A primeira coisa que precisamos fazer é criar a nossa conta de armazenamento. Lá no portal, escolha a opção “Dados + Armazenamento” e logo após, “Conta de Armazenamento”, veja:
Entre com o nome, escolha os recursos e em seguida clique em “Criar”:
Com a conta de armazenamento criada, agora vamos pegar os dados da string de conexão, lá em “Todas as configurações” e em seguida “Chaves de acesso”:
Feito isso, vamos ver as nossas chaves de acesso. Para este exemplo, vamos usar a “Chave 1” que fica dentro das “Cadeias de caracteres de conexão”:
Com o ambiente na nuvem preparado, e com a chave em mãos, vamos à aplicação, fiz uma aplicação .NET Core MVC, a mais simples possível.
Temos apenas que instalar o pacote NuGet para trabalharmos com o armazenamento do azure:
PM> Install-Package WindowsAzure.Storage -Pre
Na Index, tenho o seguinte HTML:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<form class="form-horizontal" method="post" asp-action="Upload" asp-controller="Upload" enctype="multipart/form-data"> | |
<label class="col-md-4 control-label" for="arquivo">Arquivo</label> | |
<div class="col-md-4"> | |
<input type="file" id="arquivo" name="arquivo"/> | |
</div> | |
<button class="btn btn-primary"> Upload </button> | |
</form> |
Um form simples, tenho um input chamado “arquivo”, que é o cara que vai receber o nosso arquivo, a página ficou um tanto quanto feia, mas é essa aqui:
No início do meu Controller “Upload”, tenho o seguinte código, para instanciar o serviço, a chave de acesso está no “appsettings.json”, e estou utilizando a interface “IConfigurationRoot” para acessá-la:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private readonly CloudStorageAccount _storageAccount; | |
public UploadController(IConfigurationRoot configurationRoot) | |
{ | |
//Recupera a conta de armazenamento pela connection string | |
_storageAccount = CloudStorageAccount.Parse(configurationRoot["StorageConnectionString"]); | |
} |
Quando o botão “Upload” for acionado, vamos para uma Action chamada “Upload” do Controller “Upload”… bem criativo, mas enfim, o método é esse, é só receber um “IFormFile” chamado “arquivo”(mesmo nome do input) como parâmetro da Action que o ModelBinder se vira pro seu arquivo chegar lá:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public IActionResult Upload(IFormFile arquivo) | |
{ | |
//Cria um blob client | |
CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient(); | |
//Recupera a referencia do container documentos | |
CloudBlobContainer container = blobClient.GetContainerReference("documentos"); | |
//Caso não exista, ele cria | |
container.CreateIfNotExists(); | |
//Setar permissão de acesso para 'público' | |
container.SetPermissions( | |
new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob } | |
); | |
//Recupera a referência de um blob chamado 'cliente01' | |
CloudBlockBlob blockBlob = container.GetBlockBlobReference("cliente01.pdf"); | |
//Stream do arquivo | |
Stream streamFile = arquivo.OpenReadStream(); | |
//Cria ou substitui o blob com o conteúdo do upload | |
blockBlob.UploadFromStream(streamFile); | |
return RedirectToAction("VerArquivos"); | |
} |
E é esse código acima que faz toda a “mágica”, e se entrarmos na conta de armazenamento, o arquivo está lá:
Na outra Action que se chama “VerArquivos”, vamos ver os arquivos que estão no contêiner em questão:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public IActionResult VerArquivos() | |
{ | |
//Cria um blob client | |
CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient(); | |
//Recupera a referencia do container documentos | |
CloudBlobContainer container = blobClient.GetContainerReference("documentos"); | |
//Caso não exista, ele cria | |
container.CreateIfNotExists(); | |
//Setar permissão de acesso para 'público' | |
container.SetPermissions( | |
new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob } | |
); | |
//Recupera os arquivos de um container | |
var arquivos = container.ListBlobs(); | |
return View("Documentos", arquivos); | |
} |
Onde podemos ver o arquivo que acabamos de subir para a nuvem:
Também posso ver o arquivo em meu navegador, acessando esse caminho acima:
E finalmente, também podemos excluir o arquivo:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public IActionResult Excluir() | |
{ | |
//Cria um blob client | |
CloudBlobClient blobClient = _storageAccount.CreateCloudBlobClient(); | |
//Recupera a referencia do container documentos | |
CloudBlobContainer container = blobClient.GetContainerReference("documentos"); | |
//Caso não exista, ele cria | |
container.CreateIfNotExists(); | |
//Setar permissão de acesso para 'público' | |
container.SetPermissions( | |
new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob } | |
); | |
//Recupera a referência de um blob chamado 'cliente01' | |
CloudBlockBlob blockBlob = container.GetBlockBlobReference("cliente01.pdf"); | |
//Exclui o blob caso ele exista. | |
blockBlob.DeleteIfExists(); | |
return RedirectToAction("VerArquivos"); | |
} |
Enfim, o processo é bastante simples, você garante que seus dados não serão perdidos, pois o próprio Azure faz a replicação dos seus dados para pelo menos 3 nós diferentes 😀
Para saber mais sobre os tipos de replicação e redundância é só acessar aqui.
Os exemplos de código estão disponíveis no GitHub: https://github.com/vmussak/AzureStorageExample
Por hoje é só, qualquer dúvida ou sugestão, estou à disposição! Até mais
One thought on “Upload de arquivos com .NET Core e Azure Storage”