Exercice : Chargements et téléchargements d’objets blob

Effectué

Pour interagir avec des objets blob individuels dans Stockage Blob, utilisez un objet BlobClient. Vous pouvez obtenir un BlobClient, en le demandant, avec le nom du blob, auprès de BlobContainerClient dans lequel se trouve ce blob. BlobClient a des méthodes pour charger, télécharger et gérer des objets blob individuels dans Stockage Blob.

Obtention d’un objet BlobClient

Pour obtenir un BlobClient par nom, appelez les méthodes GetBlobClient sur le BlobContainerClient qui contient le blob, en utilisant son nom. Un objet BlobClient vous permet d’interagir avec le blob, c’est-à-dire le charger, le télécharger ou le gérer dans Stockage Blob.

Le déplacement de données vers et à partir d’un objet blob est une opération réseau qui prend du temps. Le SDK Stockage Azure pour .NET fournit une implémentation asynchrone de toutes les méthodes qui nécessitent une activité réseau. Nous recommandons d’utiliser ces implémentations asynchrones autant que possible dans votre application.

Nous vous recommandons d’utiliser des flux plutôt que des structures en mémoire comme les tableaux d’octets ou les chaînes quand vous travaillez avec de grands objets de données. Cette approche évite de mettre en mémoire tampon l’intégralité du contenu en mémoire avant de l’envoyer à la cible. ASP.NET Core prend en charge les flux de lecture et d’écriture des demandes et réponses.

Pour obtenir un BlobClient par nom, appelez les méthodes getBlobClient sur le BlobContainerClient qui contient le blob, en utilisant son nom. Un objet BlobClient vous permet d’interagir avec le blob, c’est-à-dire le charger, le télécharger ou le gérer dans Stockage Blob.

Nous vous recommandons d’utiliser des flux plutôt que des structures en mémoire comme les tableaux d’octets ou les chaînes quand vous travaillez avec de grands objets de données. Cette approche évite de mettre en mémoire tampon l’intégralité du contenu en mémoire avant de l’envoyer à la cible.

Créer des objets blob

Pour créer un objet blob, appelez l’une des méthodes Upload sur une référence à un objet blob qui n’existe pas dans le stockage. Cette approche crée l’objet blob dans le stockage et charge les données.

BlobClient blobClient = containerClient.GetBlobClient(name);

var response = blobClient.UploadAsync(fileStream);

Pour créer un objet blob, appelez l’une des méthodes upload sur une référence à un objet blob qui n’existe pas dans le stockage. Cette approche crée l’objet blob dans le stockage et charge les données.

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

Exercice

Terminez votre application en ajoutant le code pour les opérations de chargement et de téléchargement, puis déployez-la sur Azure App Service afin de la tester.

Charger

Pour charger un objet blob, vous implémentez la méthode BlobStorage.Save. Tout d’abord, vous obtenez un objet BlobClient qui représente le blob en appelant GetBlobClient sur un BlobContainerClient. Ensuite, utilisez la méthode UploadAsync sur le BlobClient pour enregistrer le Stream des données passées à cette méthode jusqu’au Stockage Blob.

  • Dans l’éditeur, dans BlobStorage.cs, remplacez Save par le code suivant. Utilisez CTRL+S pour enregistrer votre travail.

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

    Remarque

    Le code de chargement basé sur les flux présenté ici est plus efficace que la lecture du fichier dans un tableau d’octets avant son envoi à Stockage Blob Azure. Toutefois, la technique IFormFile ASP.NET Core que vous utilisez pour obtenir le fichier à partir du client n’est pas une véritable implémentation de streaming de bout en bout. Elle est appropriée uniquement pour la gestion des chargements de petits fichiers.

Pour charger un objet blob, vous implémentez la méthode BlobStorage.save. Tout d’abord, vous obtenez un objet BlobClient qui représente le blob en appelant getBlobClient sur un BlobContainerClient. Ensuite, utilisez la méthode upload sur le BlobClient pour enregistrer le InputStream des données passées à cette méthode jusqu’au Stockage Blob.

  • Dans l’éditeur, dans BlobStorage.java, remplacez save par le code suivant.

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

Téléchargement

Pour télécharger un fichier, la méthode OpenReadAsync sur l’objet BlobClient est retournée. Cette méthode retourne un Stream, ce qui signifie que votre code n’a pas besoin de charger tous les octets du Stockage Blob à la fois. Vous devez simplement retourner une référence au flux d’objets blob, qu’ASP.NET Core peut utiliser pour envoyer en streaming le fichier au navigateur.

  • Remplacez Load par ce code, puis enregistrez votre travail en utilisant 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();
    }
    

Pour télécharger un fichier, utilisez la méthode openInputStream sur BlobClient. Cette méthode retourne un InputStream, ce qui signifie que votre code n’a pas besoin de charger tous les octets du Stockage Blob à la fois. Vous devez simplement retourner une référence au flux d’objets blob, que IndexBean peut utiliser pour envoyer en streaming le contenu au navigateur.

Remplacez read par ce code, puis enregistrez votre travail.

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

Déployer et exécuter dans Azure

Votre application est terminée. Déployez-la et regardez comment elle fonctionne.

  1. Créez une application App Service, et configurez-la avec les paramètres d’application correspondant à la chaîne de connexion du compte de stockage et au nom du conteneur. Obtenez la chaîne de connexion du compte de stockage avec az storage account show-connection-string, et affectez au nom du conteneur la valeur files.

    Le nom de l’application doit être globalement unique. Choisissez votre propre nom pour renseigner <your-unique-app-name>. Utilisez le nom du compte de stockage que vous avez créé précédemment pour remplacer <your-unique-storage-account-name>. Exécutez chacune des commandes suivantes dans l’ordre dans Azure CLI :

    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. Déployez votre application. Les commandes suivantes publient le site dans le dossier pub, le compressent dans site.zip, puis déploient le fichier zip dans App Service.

    Remarque

    Assurez-vous que votre interpréteur de commandes se trouve toujours dans le répertoire mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start avant d’exécuter les commandes suivantes. Vous pouvez utiliser cd mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start pour changer de répertoire et désigner cet emplacement.

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

    Pour voir l’application s’exécuter, dans un navigateur, ouvrez https://<your-unique-app-name>.azurewebsites.net. Elle doit ressembler à l’image suivante.

    Screenshot of the FileUploader web app for C#.

  3. Essayez de charger et télécharger des fichiers pour tester l’application. Une fois que vous avez chargé quelques fichiers, pour voir les objets blob dans le conteneur, exécutez la commande suivante dans l’interpréteur de commandes. Remplacez <your-unique-storage-account-name> par le nom du compte de stockage que vous avez créé précédemment dans le module :

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

Votre application est terminée. Déployez-la et regardez comment elle fonctionne. Utilisez le plug-in Maven pour Azure App Service afin de créer une application App Service, la configurer et la déployer.

  1. Dans l’éditeur, ouvrez le fichier pom.xml et ajoutez plugins sous la balise 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. Les commandes suivantes préparent les variables d’environnement pour le plug-in Maven pour Azure App Service. Extrayez la chaîne de connexion du compte de stockage avec az storage account show-connection-string, l’ID d’abonnement avec az account show et définissez la région, les tarifs, le nom du conteneur et le nom de l’application. Le nom de l’application doit être globalement unique. Choisissez votre propre nom pour renseigner <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
    

    Conseil

    Le niveau minimal recommandé pour le déploiement d’applications Java réelles est n’importe quel plan de service Premium V2.

  3. Déployez votre application. La commande suivante génère l’application dans ROOT.war, puis déploie le fichier WAR sur App Service. Le plug-in Maven pour Azure App Service provisionne les ressources lors de la première tentative de déploiement.

    Remarque

    Assurez-vous que votre interpréteur de commandes se trouve toujours dans le répertoire mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start avant d’exécuter les commandes suivantes. Vous pouvez utiliser cd mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start pour changer de répertoire et désigner cet emplacement.

    mvn clean package azure-webapp:deploy
    

    Pour voir l’application s’exécuter, dans un navigateur, ouvrez https://<your-unique-app-name>.azurewebsites.net. Elle doit ressembler à l’image suivante.

    Screenshot of the FileUploader web app for Java.

    Conseil

    Ce module utilise le plug-in Maven pour Azure App Service afin de déployer l’application sur Tomcat 9 sur Azure App Service. Pour découvrir d’autres options, consultez la section En savoir plus à la fin de ce module.

  4. Essayez de charger et télécharger des fichiers pour tester l’application. Une fois que vous avez chargé quelques fichiers, pour voir les objets blob dans le conteneur, exécutez la commande suivante dans l’interpréteur de commandes.

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