Upload de arquivos com .NET Core e Azure Storage

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:

09

  • 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:
01

Entre com o nome, escolha os recursos e em seguida clique em “Criar”:
02

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”:
03

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”:
04

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:

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

view raw
Index.cshtml
hosted with ❤ by GitHub

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:
05

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:

private readonly CloudStorageAccount _storageAccount;
public UploadController(IConfigurationRoot configurationRoot)
{
//Recupera a conta de armazenamento pela connection string
_storageAccount = CloudStorageAccount.Parse(configurationRoot["StorageConnectionString"]);
}

view raw
CloudStorage.cs
hosted with ❤ by GitHub

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á:

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");
}

view raw
Upload.cs
hosted with ❤ by GitHub

E é esse código acima que faz toda a “mágica”, e se entrarmos na conta de armazenamento, o arquivo está lá:
07

Na outra Action que se chama “VerArquivos”, vamos ver os arquivos que estão no contêiner em questão:

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

view raw
VerArquivos.cs
hosted with ❤ by GitHub

Onde podemos ver o arquivo que acabamos de subir para a nuvem:
06

Também posso ver o arquivo em meu navegador, acessando esse caminho acima:

08

E finalmente, também podemos excluir o arquivo:

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");
}

view raw
Excluir.cshtml
hosted with ❤ by GitHub

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

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google photo

Está a comentar usando a sua conta Google Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s