Oefening: Blob-uploads en -downloads

Voltooid

Gebruik een BlobClient object om te communiceren met afzonderlijke blobs in Blob Storage. U kunt een BlobClient aanvraag indienen door deze aan te vragen met de naam van de blob van de BlobContainerClient blob waarin de blob zich bevindt. BlobClient bevat methoden voor het uploaden, downloaden en beheren van afzonderlijke blobs in Blob Storage.

Een BlobClient-object ophalen

Als u een BlobClient op naam wilt ophalen, roept u de GetBlobClient methoden aan op de BlobContainerClient blob met behulp van de naam van de blob. Met een BlobClient object kunt u communiceren met de blob door de blob te uploaden, te downloaden of te beheren in Blob Storage.

Het verplaatsen van gegevens naar en uit een blob is een netwerkbewerking die tijd in beslag neemt. De Azure Storage SDK voor .NET biedt asynchrone implementatie van alle methoden waarvoor netwerkactiviteit is vereist. We raden u aan deze asynchrone implementaties waar mogelijk te gebruiken in uw toepassing.

We raden u aan streams te gebruiken in plaats van in-memory structuren, zoals bytematrices of tekenreeksen wanneer u met grote gegevensobjecten werkt. Deze aanpak voorkomt dat de volledige inhoud in het geheugen wordt gebufferd voordat deze naar het doel wordt verzonden. ASP.NET Core biedt ondersteuning voor het lezen en schrijven van stromen voor aanvragen en reacties.

Als u een BlobClient op naam wilt ophalen, roept u de getBlobClient methoden aan op de BlobContainerClient blob met behulp van de naam van de blob. Met een BlobClient object kunt u communiceren met de blob door de blob te uploaden, te downloaden of te beheren in Blob Storage.

We raden u aan streams te gebruiken in plaats van in-memory structuren, zoals bytematrices of tekenreeksen wanneer u met grote gegevensobjecten werkt. Deze aanpak voorkomt dat de volledige inhoud in het geheugen wordt gebufferd voordat deze naar het doel wordt verzonden.

Nieuwe blobs maken

Als u een nieuwe blob wilt maken, roept u een van de Upload-methoden aan in een verwijzing naar een blob die niet in de opslag is opgenomen. Deze aanpak doet twee dingen: hiermee maakt u de blob in de opslag en uploadt u de gegevens.

BlobClient blobClient = containerClient.GetBlobClient(name);

var response = blobClient.UploadAsync(fileStream);

Als u een nieuwe blob wilt maken, roept u een van de upload-methoden aan in een verwijzing naar een blob die niet in de opslag is opgenomen. Deze aanpak doet twee dingen: maakt de blob in de opslag en uploadt de gegevens.

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

Oefening

Voltooi uw app door de upload- en downloadcode toe te voegen en deze vervolgens te implementeren in Azure-app Service voor testen.

Uploaden

Als u een blob wilt uploaden, implementeert u de BlobStorage.Save methode. Eerst krijgt u een BlobClient object dat de blob vertegenwoordigt door een aanroep uit te BlobContainerClientschakelenGetBlobClient. Gebruik vervolgens de UploadAsync methode op de BlobClient methode om de Stream gegevens op te slaan die aan deze methode zijn doorgegeven tot Blob Storage.

  • In de editor vervangt u Save in BlobStorage.cs door de volgende code. Gebruik Ctrl+S om uw werk op te slaan.

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

    Notitie

    De hier weergegeven uploadcode op basis van een stroom is efficiënter dan het lezen van het bestand in een bytematrix voordat het naar Blob Storage wordt verzonden. De ASP.NET Core-techniek IFormFile die u gebruikt om het bestand van de client op te halen, is echter geen echte end-to-end streaming-implementatie. Het is alleen geschikt voor het verwerken van uploads van kleine bestanden.

Als u een blob wilt uploaden, implementeert u de BlobStorage.save methode. Eerst krijgt u een BlobClient object dat de blob vertegenwoordigt door een aanroep uit te BlobContainerClientschakelengetBlobClient. Gebruik vervolgens de upload methode op de BlobClient methode om de InputStream gegevens op te slaan die aan deze methode zijn doorgegeven tot Blob Storage.

  • In de editor vervangt u save in BlobStorage.java door de volgende code.

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

Downloaden

Als u een bestand wilt downloaden, wordt de OpenReadAsync methode voor het BlobClient object geretourneerd. Deze methode retourneert een Stream, wat betekent dat uw code niet alle bytes uit Blob Storage tegelijk hoeft te laden. U hoeft alleen een verwijzing naar de blobstroom te retourneren, die ASP.NET Core kan gebruiken om het bestand naar de browser te streamen.

  • Vervang Load door deze code en sla uw werk op met 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();
    }
    

Als u een bestand wilt downloaden, gebruikt u de openInputStream methode op de BlobClient. Deze methode retourneert een InputStream, wat betekent dat uw code niet alle bytes uit Blob Storage tegelijk hoeft te laden. U hoeft alleen een verwijzing naar de blobstream te retourneren, die IndexBean kan worden gebruikt om de inhoud naar de browser te streamen.

Vervang read door deze code en sla uw werk op.

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

Implementeren en uitvoeren in Azure

Uw app is voltooid. Implementeer het en zie hoe het werkt.

  1. Maak een App Service-app en configureer deze met app-instellingen voor de verbindingstekenreeks van uw opslagaccount en de containernaam. Haal de verbindingstekenreeks van het opslagaccount op met az storage account show-connection-string en stel de naam van de container in op files.

    De naam van de app moet wereldwijd uniek zijn. Kies uw eigen naam om in <your-unique-app-name>te vullen. Gebruik de naam van het opslagaccount die u eerder hebt gemaakt om te vervangen <your-unique-storage-account-name>. Voer elk van de volgende opdrachten in de volgorde uit in 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. Implementeer uw app. Met de volgende opdrachten publiceert u de site naar de pubmap , zipt u deze in site.zip en implementeert u de zip in App Service.

    Notitie

    Zorg ervoor dat uw shell zich nog steeds in de map mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start bevindt voordat u de volgende opdrachten uitvoert. U kunt cd mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start gebruiken om de richting naar deze locatie te wijzigen.

    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>
    

    Open https://<your-unique-app-name>.azurewebsites.net in een browser om te bekijken hoe de app wordt uitgevoerd. Het zou er als de volgende afbeelding uit moeten zien.

    Schermopname van de FileUploader-web-app voor C#.

  3. Upload en download enkele bestanden om de app te testen. Nadat u een paar bestanden hebt geüpload, voert u de volgende code uit in de shell om de blobs in de container te zien. Vervang <your-unique-storage-account-name> door de naam van het opslagaccount dat u eerder in de module hebt gemaakt:

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

Uw app is voltooid. Implementeer het en zie hoe het werkt. Gebruik de Maven-invoegtoepassing voor Azure-app Service om een App Service-app te maken, deze te configureren en te implementeren.

  1. Open het bestand in de editor pom.xml en voeg het volgende plugins toe onder de build XML-tag.

    <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. Met de volgende opdrachten worden omgevingsvariabelen voorbereid voor de Maven-invoegtoepassing voor Azure-app Service. Pak de verbindingsreeks van het opslagaccount uit metaz storage account show-connection-string, de abonnements-id met az account showen stel regio, prijzen, containernaam en app-naam in. De naam van de app moet wereldwijd uniek zijn. Kies uw eigen naam om in <your-unique-app-name>te vullen.

    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
    

    Tip

    De minimaal aanbevolen laag voor het implementeren van echte Java-toepassingen is een Premium V2-serviceplan.

  3. Implementeer uw app. Met de volgende opdracht wordt de app in ROOT.war gebouwd en wordt het WAR-bestand geïmplementeerd in App Service. De Maven-invoegtoepassing voor Azure-app Service richt resources in bij de eerste implementatiepoging.

    Notitie

    Zorg ervoor dat uw shell zich nog steeds in de map mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start directory bevindt voordat u de volgende opdrachten uitvoert. U kunt cd mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start gebruiken om de richting naar deze locatie te wijzigen.

    mvn clean package azure-webapp:deploy
    

    Open https://<your-unique-app-name>.azurewebsites.net in een browser om te bekijken hoe de app wordt uitgevoerd. Het zou er als de volgende afbeelding uit moeten zien.

    Schermopname van de FileUploader-web-app voor Java.

    Tip

    Deze module maakt gebruik van de Maven-invoegtoepassing voor Azure-app Service om de app te implementeren op Tomcat 9 op Azure-app Service. Zie de sectie Meer lezen aan het einde van deze module voor meer informatie over andere opties.

  4. Upload en download enkele bestanden om de app te testen. Nadat u een paar bestanden hebt geüpload, voert u de volgende code uit in de shell om de blobs in de container te zien.

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