Übung: Blobuploads und -downloads

Abgeschlossen

Um in Blob Storage mit einzelnen Blobs zu interagieren, verwenden Sie ein BlobClient-Objekt. Ein BlobClient-Objekt wird abgerufen, indem Sie es mit dem Namen des Blobs aus dem BlobContainerClient-Objekt anfordern, in dem sich das Blob befindet. Das BlobClient-Objekt verfügt über Methoden zum Hochladen, Herunterladen und Verwalten einzelner Blobs in Blob Storage.

Abrufen eines BlobClient-Objekts

Um ein BlobClient-Objekt nach Namen abzurufen, rufen Sie die GetBlobClient-Methoden für das BlobContainerClient-Objekt, das das Blob enthält, mit dem Namen des Blobs auf. Mit einem BlobClient-Objekt können Sie mit dem Blob interagieren, indem Sie das Blob in Blob Storage hochladen, herunterladen oder verwalten.

Das Verschieben von Daten in und aus einem Blob ist ein Netzwerkvorgang, der Zeit in Anspruch nimmt. Das Azure Storage SDK für .NET bietet eine asynchrone Implementierung aller Methoden, die Netzwerkaktivität erfordern. Wir empfehlen, diese asynchronen Implementierungen in Ihrer Anwendung immer zu verwenden, wenn sich die Möglichkeit dazu bietet.

Bei der Arbeit mit großen Datenobjekten empfehlen wir die Verwendung von Streams anstelle von In-Memory-Strukturen wie Byte-Arrays oder Strings. Auf diese Weise wird vermieden, dass der gesamte Inhalt im Speicher zwischengespeichert wird, bevor er an das Ziel gesendet wird. ASP.NET Core unterstützt das Lesen und Schreiben von Datenströmen aus Anforderungen und Antworten.

Um ein BlobClient-Objekt nach Namen abzurufen, rufen Sie die getBlobClient-Methoden für das BlobContainerClient-Objekt, das das Blob enthält, mit dem Namen des Blobs auf. Mit einem BlobClient-Objekt können Sie mit dem Blob interagieren, indem Sie das Blob in Blob Storage hochladen, herunterladen oder verwalten.

Bei der Arbeit mit großen Datenobjekten empfehlen wir die Verwendung von Streams anstelle von In-Memory-Strukturen wie Byte-Arrays oder Strings. Auf diese Weise wird vermieden, dass der gesamte Inhalt im Speicher zwischengespeichert wird, bevor er an das Ziel gesendet wird.

Erstellen neuer Blobs

Rufen Sie eine der Upload-Methoden für einen Verweis auf ein Blob auf, das nicht im Speicher vorhanden ist, um ein neues Blob zu erstellen. Dadurch wird der Blob im Speicher erstellt und die Daten werden hochgeladen.

BlobClient blobClient = containerClient.GetBlobClient(name);

var response = blobClient.UploadAsync(fileStream);

Rufen Sie eine der upload-Methoden für einen Verweis auf ein Blob auf, das nicht im Speicher vorhanden ist, um ein neues Blob zu erstellen. Dadurch wird der Blob im Speicher erstellt und die Daten werden hochgeladen.

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

Übung

Stellen Sie Ihre App fertig, indem Sie den Upload- und Download-Code hinzufügen, und stellen Sie sie dann zum Testen bei Azure App Service bereit.

Hochladen

Um ein Blob hochzuladen, müssen Sie die BlobStorage.Save-Methode implementieren. Zuerst müssen Sie ein BlobClient-Objekt abrufen, das das Blob darstellt, indem Sie GetBlobClient für einen BlobContainerClient aufrufen. Anschließend führen Sie die UploadAsync-Methode für den BlobClient aus, um den an diese Methode übergebenen Daten-Stream in Blob Storage zu speichern.

  • Öffnen Sie BlobStorage.cs im Editor, und ersetzen Sie Save durch folgenden Code: Verwenden Sie STRG+S, um Ihre Arbeit zu speichern.

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

    Hinweis

    Der in diesem Codeausschnitt gezeigte streambasierte Uploadcode ist effizienter als das Lesen der Datei in ein Bytearray, bevor es an Blob Storage gesendet wird. Die ASP.NET Core-Technik IFormFile, die Sie zum Abrufen der Datei vom Client verwenden, ist jedoch keine echte End-to-End-Streaming-Implementierung. Sie eignet sich nur für das Hochladen von kleinen Dateien.

Um einen Blob hochzuladen, implementieren Sie die Methode BlobStorage.save. Zuerst müssen Sie ein BlobClient-Objekt abrufen, das das Blob darstellt, indem Sie getBlobClient für einen BlobContainerClient aufrufen. Anschließend führen Sie die upload-Methode für den BlobClient aus, um den an diese Methode übergebenen Daten-InputStream in Blob Storage zu speichern.

  • Öffnen Sie BlobStorage.java im Editor, und ersetzen Sie save durch folgenden Code:

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

Download

Um eine Datei herunterzuladen, wird die OpenReadAsync-Methode für das BlobClient-Objekt zurückgegeben. Diese Methode gibt einen Stream zurück, was bedeutet, dass Ihr Code nicht alle Bytes aus Blob Storage gleichzeitig laden muss. Sie müssen lediglich einen Verweis auf den Blob-Stream zurückgeben, den ASP.NET Core verwenden kann, um die Datei an den Browser zu streamen.

  • Ersetzen Sie Load durch den folgenden Code, und speichern Sie Ihre Arbeit mithilfe von STRG+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();
    }
    

Wenden Sie die openInputStream-Methode auf BlobClient an, um Dateien herunterzuladen. Diese Methode gibt einen InputStream zurück, was bedeutet, dass Ihr Code nicht alle Bytes aus Blob Storage gleichzeitig laden muss. Sie müssen lediglich einen Verweis auf den Blob-Stream zurückgeben, den IndexBean verwenden kann, um die Datei an den Browser zu streamen.

Ersetzen Sie read durch den folgenden Code, und speichern Sie Ihre Arbeit:

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

Bereitstellen und Ausführen in Azure

Ihre App ist fertig. Stellen Sie sie bereit, und sehen Sie zu, wie sie funktioniert.

  1. Erstellen Sie eine App Service-App, und konfigurieren Sie diese mit den App-Einstellungen für die Verbindungszeichenfolge und den Containernamen des Speicherkontos. Rufen Sie mit az storage account show-connection-string die Verbindungszeichenfolge des Speicherkontos ab, und legen Sie den Namen des Containers auf files fest.

    Der App-Name muss global eindeutig sein. Wählen Sie Ihren eigenen Namen aus, der in <your-unique-app-name> eingesetzt werden soll. Verwenden Sie auch den Speicherkontonamen, den Sie zuvor erstellt haben, um <your-unique-storage-account-name> zu ersetzen. Führen Sie jeden der folgenden Befehle in der folgenden Reihenfolge in der Azure CLI aus:

    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. Stellen Sie Ihre App bereit. Mit den folgenden Befehlen wird die Website im Ordner pub veröffentlicht, in site.zip gepackt und die .zip-Datei in App Service bereitgestellt.

    Hinweis

    Stellen Sie sicher, dass sich Ihre Shell noch im Verzeichnis mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start befindet, bevor Sie die folgenden Befehle ausführen. Sie können cd mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start verwenden, um das Verzeichnis in diesen Speicherort zu ändern.

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

    Öffnen Sie https://<your-unique-app-name>.azurewebsites.net in einem Browser, um die ausgeführte App anzuzeigen. Das Ergebnis sollte folgendermaßen aussehen:

    Screenshot of the FileUploader web app for C#.

  3. Versuchen Sie, einige Dateien hoch- und herunterzuladen, um die App zu testen. Nachdem Sie ein paar Dateien hochgeladen haben, führen Sie den folgenden Code in der Shell aus, um die Blobs im Container zu sehen. Ersetzen Sie <your-unique-storage-account-name> durch den Namen des Speicherkontos, das Sie zuvor in diesem Modul erstellt haben:

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

Ihre App ist fertig. Stellen Sie sie bereit, und sehen Sie zu, wie sie funktioniert. Verwenden Sie das Maven Plugin für Azure App Service, um eine App Service-App zu erstellen, zu konfigurieren und bereitzustellen.

  1. Öffnen Sie im Editor die Datei pom.xml und fügen Sie das folgende plugins unter dem xml-Tag build hinzu.

    <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. Die folgenden Befehle bereiten Umgebungsvariablen für das Maven-Plug-In für Azure App Service vor. Extrahieren Sie die Verbindungszeichenfolge des Speicherkontos mit az storage account show-connection-string, die Abonnement-ID mit az account show und legen Sie Region, Preis, Containername und App-Name fest. Der App-Name muss global eindeutig sein. Wählen Sie Ihren eigenen Namen aus, der in <your-unique-app-name> eingesetzt werden soll.

    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
    

    Tipp

    Der empfohlene Mindesttarif für die Bereitstellung von Java-Anwendungen für den Praxiseinsatz ist ein beliebiger Premium V2-Dienstplan.

  3. Stellen Sie Ihre App bereit. Der folgende Befehl erstellt die App in ROOT.war und stellt die .war-Datei dem App Service zur Verfügung. Das Maven Plugin für Azure App Service stellt beim ersten Bereitstellungsversuch Ressourcen bereit.

    Hinweis

    Stellen Sie sicher, dass sich Ihre Shell noch im Verzeichnis mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start befindet, bevor Sie die folgenden Befehle ausführen. Sie können cd mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start verwenden, um das Verzeichnis in diesen Speicherort zu ändern.

    mvn clean package azure-webapp:deploy
    

    Öffnen Sie https://<your-unique-app-name>.azurewebsites.net in einem Browser, um die ausgeführte App anzuzeigen. Das Ergebnis sollte folgendermaßen aussehen:

    Screenshot of the FileUploader web app for Java.

    Tipp

    Dieses Modul verwendet das Maven Plugin für Azure App Service, um die App auf Tomcat 9 auf Azure App Service einzusetzen. Weitere Informationen zu anderen Optionen finden Sie im Abschnitt Weiterführende Literatur am Ende dieses Moduls.

  4. Versuchen Sie, einige Dateien hoch- und herunterzuladen, um die App zu testen. Nachdem Sie ein paar Dateien hochgeladen haben, führen Sie den folgenden Code in der Shell aus, um die Blobs im Container zu sehen.

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