Übung: Blobuploads und -downloads
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 SieSave
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 Siesave
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.
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 auffiles
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
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: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.
Öffnen Sie im Editor die Datei pom.xml und fügen Sie das folgende
plugins
unter dem xml-Tagbuild
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>
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 mitaz 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.
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: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.
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