Ejercicio: cargas y descargas de blobs
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
remplaceSave
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
remplacesave
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.
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 comofiles
.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
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 deploy \ --src-path ../site.zip \ --resource-group "<rgn>[sandbox resource group name]</rgn>" \ --name <your-unique-app-name>
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.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.
En el editor, abra el archivo pom.xml y agregue el siguiente
plugins
bajo la etiqueta 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>
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 conaz 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.
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.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.
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