Ejercicio: cargas y descargas de blobs

Completado

Para interactuar con blobs individuales en Blob Storage, use un objeto BlobClient. Puede obtener un objeto BlobClient solicitándolo con el nombre del blob desde el elemento BlobContainerClient en el que se encuentra el blob. BlobClient tiene métodos para cargar, descargar y administrar blobs individuales en Blob Storage.

Obtención de un objeto BlobClient

Para obtener un objeto BlobClient por nombre, llame a los métodos GetBlobClient del objeto BlobContainerClient que contiene el blob; para ello, use el nombre del blob. Un objeto BlobClient permite interactuar con el blob cargándolo, descargándolo o administrándolo en Blob Storage.

El traslado de datos hacia y desde un blob es una operación de red que lleva tiempo. El SDK de Azure Storage para .NET proporciona una implementación asincrónica de todos los métodos que requieren actividad de red. Se recomienda usar estas implementaciones asincrónicas siempre que sea posible en la aplicación.

Se recomienda usar secuencias en lugar de estructuras en memoria, como cadenas o matrices de bytes, cuando se trabaja con objetos de datos de gran tamaño. Este enfoque evita el almacenamiento en búfer del contenido completo en la memoria antes de enviarlo al destino. ASP.NET Core admite la lectura y escritura de secuencias desde solicitudes y respuestas.

Para obtener un objeto BlobClient por nombre, llame a los métodos getBlobClient del objeto BlobContainerClient que contiene el blob; para ello, use el nombre del blob. Un objeto BlobClient permite interactuar con el blob cargándolo, descargándolo o administrándolo en Blob Storage.

Se recomienda usar secuencias en lugar de estructuras en memoria, como cadenas o matrices de bytes, cuando se trabaja con objetos de datos de gran tamaño. Este enfoque evita el almacenamiento en búfer del contenido completo en la memoria antes de enviarlo al destino.

Creación de blobs

Para crear un blob, llame a uno de los métodos Upload en una referencia a un blob que no existe en el almacenamiento. Este enfoque hace dos cosas: crea el blob en el almacenamiento y carga los datos.

BlobClient blobClient = containerClient.GetBlobClient(name);

var response = blobClient.UploadAsync(fileStream);

Para crear un blob, llame a uno de los métodos upload en una referencia a un blob que no existe en el almacenamiento. Este enfoque hace dos cosas: crea el blob en el almacenamiento y carga los datos.

BlobClient blobClient = blobContainerClient.getBlobClient(name);
blobClient.upload(inputStream, contentLength);

Ejercicio

Finalice la aplicación agregando el código de carga y descarga y, a continuación, impleméntela en Azure App Service para realizar pruebas.

Cargar

Para cargar un blob, implemente el método BlobStorage.Save. En primer lugar, obtenga un objeto BlobClient que representa el blob mediante una llamada a GetBlobClient en BlobContainerClient. Luego, use el método UploadAsync en BlobClient para guardar el objeto Stream de los datos pasados a este método hasta Blob Storage.

  • En el editor, en BlobStorage.cs remplace Save con el código siguiente. Use CTRL+S para guardar el trabajo.

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

    Nota:

    El código de carga basado en secuencias que se muestra aquí es más eficaz que la lectura del archivo en una matriz de bytes antes de enviarlo a Blob Storage. Sin embargo, la técnica de ASP.NET Core IFormFile que usa para obtener el archivo del cliente no es una implementación verdadera de streaming de un extremo a otro. Solo es adecuada para controlar las cargas de archivos pequeños.

Para cargar un blob, implemente el método BlobStorage.save. En primer lugar, obtenga un objeto BlobClient que representa el blob mediante una llamada a getBlobClient en BlobContainerClient. Luego, use el método upload en BlobClient para guardar el objeto InputStream de los datos pasados a este método hasta Blob Storage.

  • En el editor, en BlobStorage.java remplace save con el código siguiente.

    public void save(String name, InputStream inputStream, long contentLength) {
        BlobClient blobClient = blobContainerClient.getBlobClient(name);
        blobClient.upload(inputStream, contentLength);
    }
    

Descargar

Para descargar un archivo, se devuelve el método OpenReadAsync en el objeto BlobClient. Este método devuelve Stream, lo que significa que el código no necesita cargar todos los bytes de Blob Storage a la vez. Solo tiene que devolver una referencia a la secuencia de blobs, que ASP.NET Core puede usar para transmitir el archivo al explorador.

  • Reemplace Load con este código y guarde el trabajo mediante 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 descargar un archivo, use el método openInputStream en BlobClient. Este método devuelve InputStream, lo que significa que el código no necesita cargar todos los bytes de Blob Storage a la vez. Solo tiene que devolver una referencia a la secuencia de blobs, que IndexBean puede usar para transmitir el contenido al explorador.

Reemplace read con este código y guarde el trabajo.

public InputStream read(String name) {
    BlobClient blobClient = blobContainerClient.getBlobClient(name);
    return blobClient.openInputStream();
}

Implementación y ejecución en Azure

La aplicación ha finalizado. Impleméntela y vea que funciona.

  1. Cree una aplicación de App Service y configúrela con la configuración de la aplicación para la cadena de conexión de la cuenta de almacenamiento y el nombre de contenedor. Obtenga la cadena de conexión de la cuenta de almacenamiento con az storage account show-connection-string y defina el nombre del contenedor como files.

    El nombre de la aplicación debe ser único globalmente. Elija su propio nombre para rellenar en <your-unique-app-name>. Use el nombre de la cuenta de almacenamiento que creó anteriormente para reemplazar <your-unique-storage-account-name>. Ejecute cada uno de los siguientes comandos en orden en la CLI de 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. Implementar la aplicación. Los siguientes comandos publican el sitio en la carpeta pub, lo comprimen en site.zip e implementan el archivo ZIP en App Service.

    Nota:

    Asegúrese de que el shell todavía está en el directorio mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start antes de ejecutar los siguientes comandos. Puede usar cd mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start para cambiar el directorio a esta ubicación.

    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 la aplicación en ejecución, abra https://<your-unique-app-name>.azurewebsites.net en un explorador. Debería tener un aspecto similar al de la imagen siguiente.

    Screenshot of the FileUploader web app for C#.

  3. Intente cargar y descargar algunos archivos para probar la aplicación. Después de cargar algunos archivos, para ver los blobs en el contenedor, ejecute el código siguiente en el shell. Reemplace <your-unique-storage-account-name> por el nombre de la cuenta de almacenamiento que creó anteriormente en el módulo:

    az storage blob list --account-name <your-unique-storage-account-name> --container-name files --query [].{Name:name} --output table
    

La aplicación ha finalizado. Impleméntela y vea que funciona. Use el complemento Maven para Azure App Service para crear una aplicación de App Service, configurarla e implementarla.

  1. En el editor, abra el archivo pom.xml y agregue el siguiente plugins bajo la etiqueta 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. Los comandos siguientes preparan variables de entorno para el complemento Maven para Azure App Service. Extraiga la cadena de conexión de la cuenta de almacenamiento con az storage account show-connection-string y el id. de suscripción con az account show, y establezca la región, los precios, el nombre del contenedor y el nombre de la aplicación. El nombre de la aplicación debe ser único globalmente. Elija su propio nombre para rellenar en <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
    

    Sugerencia

    El nivel mínimo recomendado para implementar aplicaciones Java reales es cualquier plan de servicio Premium V2.

  3. Implementar la aplicación. El siguiente comando compila la aplicación en ROOT.war e implementa el archivo WAR en App Service. El complemento Maven para Azure App Service aprovisiona los recursos en el primer intento de implementación.

    Nota:

    Asegúrese de que el shell todavía está en el directorio mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start antes de ejecutar los siguientes comandos. Puede usar cd mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start para cambiar el directorio a esta ubicación.

    mvn clean package azure-webapp:deploy
    

    Para ver la aplicación en ejecución, abra https://<your-unique-app-name>.azurewebsites.net en un explorador. Debería tener un aspecto similar al de la imagen siguiente.

    Screenshot of the FileUploader web app for Java.

    Sugerencia

    En este módulo se usa el complemento Maven para Azure App Service para implementar la aplicación en Tomcat 9 en Azure App Service. Para obtener información sobre otras opciones, consulte la sección Lectura adicional al final de este módulo.

  4. Intente cargar y descargar algunos archivos para probar la aplicación. Después de cargar algunos archivos, para ver los blobs en el contenedor, ejecute el código siguiente en el shell.

    az storage blob list --account-name <your-unique-storage-account-name> --container-name files --query [].{Name:name} --output table