Exercício – Uploads e downloads de blob

Concluído

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 em BlobClient salvar o Stream dos dados passados para esse método até o Armazenamento de Blobs.

  • No editor, em BlobStorage.cs, substitua Save 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, substitua save 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.

  1. 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 como files.

    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
    
  2. 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 deployment source config-zip \
    --src ../site.zip \
    --name <your-unique-app-name> \
    --resource-group "<rgn>[sandbox resource group name]</rgn>"
    

    Para ver o aplicativo em execução em um navegador, abra https://<your-unique-app-name>.azurewebsites.net. Ele será semelhante à imagem a seguir.

    Screenshot of the FileUploader web app for C#.

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

  1. No editor, abra o arquivo pom.xml e adicione o plugins a seguir sob a marca xml build.

    <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>
    
  2. 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 com az 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.

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

    Screenshot of the FileUploader web app for Java.

    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.

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