Exercício – Uploads e downloads de blob
Para interagir com blobs individuais no Armazenamento de Blobs, use um objeto BlobClient
. Você receberá um BlobClient
ao fazer a solicitação com o nome do Blob do BlobContainerClient
no qual o Blob está localizado. BlobClient
tem métodos para carregar, baixar e gerenciar blobs individuais no Armazenamento de Blobs.
Obter um objeto BlobClient
Para obter um BlobClient
por nome, chame os métodos GetBlobClient
no BlobContainerClient
usando o nome do Blob que o contém. Um objeto BlobClient
permite que você interaja com o Blob, carregando, baixando ou gerenciando-o no Armazenamento de Blobs.
A movimentação bidirecional de dados em um blob é uma operação de rede que leva tempo. O SDK do Armazenamento do Azure para .NET fornece implementação assíncrona de todos os métodos que exigem atividade de rede. Recomendamos usar essas implementações assíncronas sempre que possível no aplicativo.
É recomendável usar fluxos em vez de estruturas na memória como matrizes de bytes ou cadeias de caracteres quando você estiver trabalhando com objetos de dados grandes. Essa abordagem evita que seja feito buffer do conteúdo completo na memória antes de enviá-lo para o destino. O ASP.NET Core dá suporte à leitura e gravação de fluxos por meio de solicitações e respostas.
Para obter um BlobClient
por nome, chame os métodos getBlobClient
no BlobContainerClient
usando o nome do Blob que o contém. Um objeto BlobClient
permite que você interaja com o Blob, carregando, baixando ou gerenciando-o no Armazenamento de Blobs.
É recomendável usar fluxos em vez de estruturas na memória como matrizes de bytes ou cadeias de caracteres quando você estiver trabalhando com objetos de dados grandes. Essa abordagem evita que seja feito buffer do conteúdo completo na memória antes de enviá-lo para o destino.
Criar blobs
Para criar um blob, chame um dos métodos Upload
em uma referência a um blob que não exista no armazenamento. Essa abordagem faz duas coisas: cria o blob no armazenamento e carrega os dados.
BlobClient blobClient = containerClient.GetBlobClient(name);
var response = blobClient.UploadAsync(fileStream);
Para criar um blob, chame um dos métodos upload
em uma referência a um blob que não exista no armazenamento. Essa abordagem faz duas coisas: cria o blob no armazenamento e carrega os dados.
BlobClient blobClient = blobContainerClient.getBlobClient(name);
blobClient.upload(inputStream, contentLength);
Exercício
Conclua seu aplicativo adicionando o código de upload e download e, em seguida, implante-o no Serviço de Aplicativo do Azure para teste.
Carregar
Para carregar um blob, implemente o método BlobStorage.Save
. Primeiro, você obtém um objeto BlobClient
que representa o blob chamando GetBlobClient
em um BlobContainerClient
. Em seguida, use o método UploadAsync
no BlobClient
para salvar o Stream
dos dados passados para esse método até o Armazenamento de Blobs.
No editor, em
BlobStorage.cs
, substituaSave
pelo código a seguir. Use CTRL+S para salvar seu trabalho.public Task Save(Stream fileStream, string name) { BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString); // Get the container (folder) the file will be saved in BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName); // Get the Blob Client used to interact with (including create) the blob BlobClient blobClient = containerClient.GetBlobClient(name); // Upload the blob return blobClient.UploadAsync(fileStream); }
Observação
O código de upload baseado em fluxo que é mostrado aqui é mais eficiente do que a leitura do arquivo em uma matriz de bytes antes do envio dele para o Armazenamento de Blobs do Azure. No entanto, a técnica do ASP.NET Core
IFormFile
usada para obter o arquivo do cliente não é uma implementação de streaming de ponta a ponta verdadeira. Ele só é apropriado para lidar com uploads de arquivos pequenos.
Para carregar um blob, implemente o método BlobStorage.save
. Primeiro, você obtém um objeto BlobClient
que representa o blob chamando getBlobClient
em um BlobContainerClient
. Em seguida, use o método upload
no BlobClient
para salvar o InputStream
dos dados passados para esse método até o Armazenamento de Blobs.
No editor, em
BlobStorage.java
, substituasave
pelo código a seguir.public void save(String name, InputStream inputStream, long contentLength) { BlobClient blobClient = blobContainerClient.getBlobClient(name); blobClient.upload(inputStream, contentLength); }
Baixar
Para baixar um arquivo, o método OpenReadAsync
no objeto BlobClient
é retornado. Esse método retorna um Stream
, o que significa que seu código não precisa carregar todos os bytes do Armazenamento de Blobs de uma só vez. Você só precisa retornar uma referência ao fluxo de blobs, que ASP.NET Core pode usar para transmitir o arquivo para o navegador.
Substitua
Load
por este código e salve seu trabalho usando CTRL + S.public Task<Stream> Load(string name) { BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString); // Get the container the blobs are saved in BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName); // Get a client to operate on the blob so we can read it. BlobClient blobClient = containerClient.GetBlobClient(name); return blobClient.OpenReadAsync(); }
Para baixar um arquivo, use o método openInputStream
em BlobClient
. Esse método retorna um InputStream
, o que significa que seu código não precisa carregar todos os bytes do Armazenamento de Blobs de uma só vez. Você só precisa retornar uma referência ao fluxo de blobs, que IndexBean
pode usar para transmitir o conteúdo para o navegador.
Substitua read
por este código e salve seu trabalho.
public InputStream read(String name) {
BlobClient blobClient = blobContainerClient.getBlobClient(name);
return blobClient.openInputStream();
}
Implantar e executar no Azure
Seu aplicativo foi concluído. Implante-o e veja-o funcionar.
Crie um aplicativo do Serviço de Aplicativo e defina-o com configurações de aplicativo para a cadeia de conexão e o nome do contêiner da conta de armazenamento. Obtenha a cadeia de conexão da conta de armazenamento com
az storage account show-connection-string
e defina o nome do contêiner comofiles
.O nome do aplicativo precisa ser globalmente exclusivo. Escolha seu próprio nome para preencher
<your-unique-app-name>
. Use o nome da conta de armazenamento que você criou anteriormente para substituir<your-unique-storage-account-name>
. Execute cada um dos seguintes comandos em ordem na CLI do Azure:az appservice plan create \ --name blob-exercise-plan \ --resource-group "<rgn>[sandbox resource group name]</rgn>" \ --sku FREE --location eastus
az webapp create \ --name <your-unique-app-name> \ --plan blob-exercise-plan \ --resource-group "<rgn>[sandbox resource group name]</rgn>"
CONNECTIONSTRING=$(az storage account show-connection-string \ --name <your-unique-storage-account-name> \ --resource-group "<rgn>[sandbox resource group name]</rgn>" \ --output tsv)
az webapp config appsettings set \ --name <your-unique-app-name> --resource-group "<rgn>[sandbox resource group name]</rgn>" \ --settings AzureStorageConfig:ConnectionString=$CONNECTIONSTRING AzureStorageConfig:FileContainerName=files
Implante seu aplicativo. Os comandos a seguir publicam o site na pasta pub, o compactam em site.zip e implantam o zip no Serviço de Aplicativo.
Observação
Verifique se o shell ainda está no diretório mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start antes de executar os comandos a seguir. Você pode usar
cd mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start
para alterar o diretório para esse local.dotnet publish -o pub cd pub zip -r ../site.zip *
az webapp deploy \ --src-path ../site.zip \ --resource-group "<rgn>[sandbox resource group name]</rgn>" \ --name <your-unique-app-name>
Para ver o aplicativo em execução em um navegador, abra
https://<your-unique-app-name>.azurewebsites.net
. Ele será semelhante à imagem a seguir.Tente carregar e baixar alguns arquivos para testar o aplicativo. Depois de carregar alguns arquivos, para ver os blobs no contêiner, execute o código a seguir no shell. Substitua
<your-unique-storage-account-name>
pelo nome da conta de armazenamento que você criou anteriormente no módulo:az storage blob list --account-name <your-unique-storage-account-name> --container-name files --query [].{Name:name} --output table
Seu aplicativo foi concluído. Implante-o e veja-o funcionar. Use o plug-in do Maven para o Serviço de Aplicativo do Azure para criar, configurar e implantar um aplicativo do Serviço de Aplicativo.
No editor, abra o arquivo pom.xml e adicione o
plugins
a seguir sob a marca xmlbuild
.<plugins> <plugin> <groupId>com.microsoft.azure</groupId> <artifactId>azure-webapp-maven-plugin</artifactId> <version>2.3.0</version> <configuration> <schemaVersion>v2</schemaVersion> <subscriptionId>${env.AZ_SUBSCRIPTION_ID}</subscriptionId> <resourceGroup>${env.AZ_RESOURCE_GROUP}</resourceGroup> <appName>${env.AZ_APP_NAME}</appName> <pricingTier>${env.AZ_PRICING_TIER}</pricingTier> <region>${env.AZ_REGION}</region> <runtime> <os>Linux</os> <javaVersion>Java 11</javaVersion> <webContainer>Tomcat 9.0</webContainer> </runtime> <deployment> <resources> <resource> <directory>${project.basedir}/target</directory> <includes> <include>*.war</include> </includes> </resource> </resources> </deployment> <appSettings> <property> <name>STORAGE_CONNECTION_STRING</name> <value>${env.AZ_STORAGE_CONNECTION_STRING}</value> </property> <property> <name>STORAGE_CONTAINER_NAME</name> <value>${env.AZ_STORAGE_CONTAINER_NAME}</value> </property> </appSettings> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> </plugins>
Os comandos a seguir preparam variáveis de ambiente para o plug-in do Maven para o Serviço de Aplicativo do Azure. Extraia a cadeia de conexão da conta de armazenamento com
az storage account show-connection-string
, a ID da assinatura comaz account show
, e defina a região, o preço, o nome do contêiner e o nome do aplicativo. O nome do aplicativo precisa ser globalmente exclusivo. Escolha seu próprio nome para preencher<your-unique-app-name>
.export AZ_SUBSCRIPTION_ID=$(az account show --query id --output tsv) export AZ_RESOURCE_GROUP="<rgn>[sandbox resource group name]</rgn>" export AZ_REGION=eastus export AZ_APP_NAME=<your-unique-app-name> export AZ_PRICING_TIER=F1 export AZ_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string --name <your-unique-storage-account-name> --output tsv) export AZ_STORAGE_CONTAINER_NAME=files
Dica
A camada mínima recomendada para implantar aplicativos Java do mundo real é qualquer Plano de Serviço Premium V2.
Implante seu aplicativo. O comando a seguir cria o aplicativo em ROOT.war e implanta o arquivo WAR no Serviço de Aplicativo. O plug-in do Maven para o Serviço de Aplicativo do Azure provisiona recursos na primeira tentativa de implantação.
Observação
Verifique se o shell ainda está no diretório mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start antes de executar os comandos a seguir. Você pode usar
cd mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start
para alterar o diretório para esse local.mvn clean package azure-webapp:deploy
Para ver o aplicativo em execução em um navegador, abra
https://<your-unique-app-name>.azurewebsites.net
. Ele será semelhante à imagem a seguir.Dica
Este módulo usa o plug-in do Maven para o Serviço de Aplicativo do Azure para implantar o aplicativo no Tomcat 9 no Serviço de Aplicativo do Azure. Para saber mais sobre outras opções, confira a seção Leitura adicional ao final deste módulo.
Tente carregar e baixar alguns arquivos para testar o aplicativo. Depois de carregar alguns arquivos, para ver os blobs no contêiner, execute o código a seguir no shell.
az storage blob list --account-name <your-unique-storage-account-name> --container-name files --query [].{Name:name} --output table