練習 - Blob 上傳及下載
若要與 Blob 儲存體中的個別 Blob 互動,請使用 BlobClient
物件。 您可以使用 Blob 的名稱從 Blob 所在的 BlobContainerClient
進行要求來取得 BlobClient
。 BlobClient
具有上傳、下載及管理 Blob 儲存體中個別 Blob 的方法。
取得 BlobClient 物件
若要依名稱取得 BlobClient
,請使用 Blob 的名稱,在包含 Blob 的 BlobContainerClient
上呼叫 GetBlobClient
方法。 BlobClient
物件可讓您上傳、下載或管理 Blob 儲存體中的 Blob 來與 Blob 互動。
將資料移入和移出 Blob 是耗時的網路作業。 適用於 .NET 的 Azure 儲存體 SDK 可為所有需要網路活動的方法提供非同步實作。 建議您盡可能在應用程式中使用這些非同步實作。
我們建議您在處理大型資料物件時使用資料流,而不是記憶體內部結構 (例如二進位陣列或字串)。 此方法可避免在將完整內容傳送到目標之前,於記憶體中緩衝處理該內容。 ASP.NET Core 支援在要求與回應中讀取和寫入資料流。
若要依名稱取得 BlobClient
,請使用 Blob 的名稱,在包含 Blob 的 BlobContainerClient
上呼叫 getBlobClient
方法。 BlobClient
物件可讓您上傳、下載或管理 Blob 儲存體中的 Blob 來與 Blob 互動。
我們建議您在處理大型資料物件時使用資料流,而不是記憶體內部結構 (例如二進位陣列或字串)。 此方法可避免在將完整內容傳送到目標之前,於記憶體中緩衝處理該內容。
建立新的 Blob
若要建立新的 Blob,請對不存在於儲存體中的 Blob 參考呼叫其中一個 Upload
方法。 此方法會執行兩個工作: 在儲存體中建立 Blob,以及上傳資料。
BlobClient blobClient = containerClient.GetBlobClient(name);
var response = blobClient.UploadAsync(fileStream);
若要建立新的 Blob,請對不存在於儲存體中的 Blob 參考呼叫其中一個 upload
方法。 此方法會執行兩個工作: 在儲存體中建立 Blob,以及上傳資料。
BlobClient blobClient = blobContainerClient.getBlobClient(name);
blobClient.upload(inputStream, contentLength);
練習
新增上傳和下載程式碼,然後將之部署到 Azure App Service 進行測試,以完成應用程式。
上傳
若要上傳 Blob,您需實作 BlobStorage.Save
方法。 首先,請在 BlobContainerClient
上呼叫 GetBlobClient
,以取得代表 Blob 的 BlobClient
物件。 然後,在 BlobClient
上使用 UploadAsync
方法,將傳遞至此方法的資料 Stream
上傳儲存至 Blob 儲存體。
在編輯器中,使用下列程式碼取代
BlobStorage.cs
中的Save
。 使用 CTRL+S 儲存您的工作。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); }
注意
相較於將檔案讀入位元組陣列,再將其傳送至 Blob 儲存體,此處所顯示以資料流為主的上傳程式碼效率更高。 不過,您用來從用戶端取得檔案的 ASP.NET Core
IFormFile
技術並不是真正的端對端串流實作。 只適用於處理小型檔案的上傳。
若要上傳 Blob,您需實作 BlobStorage.save
方法。 首先,請在 BlobContainerClient
上呼叫 getBlobClient
,以取得代表 Blob 的 BlobClient
物件。 然後,在 BlobClient
上使用 upload
方法,將傳遞至此方法的資料 InputStream
上傳儲存至 Blob 儲存體。
在編輯器中,使用下列程式碼取代
BlobStorage.java
中的save
。public void save(String name, InputStream inputStream, long contentLength) { BlobClient blobClient = blobContainerClient.getBlobClient(name); blobClient.upload(inputStream, contentLength); }
下載
若要下載檔案,可傳回 BlobClient
物件上的 OpenReadAsync
方法。 這個方法會傳回 Stream
,這表示您的程式碼不需要一次從 Blob 儲存體載入所有位元組。 您只需要傳回 Blob 資料流程的參考,ASP.NET Core 可用來將檔案串流至瀏覽器。
以此程式碼取代
Load
,並使用 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(); }
若要下載檔案,請在 BlobClient
上使用 openInputStream
方法。 這個方法會傳回 InputStream
,這表示您的程式碼不需要一次從 Blob 儲存體載入所有位元組。 您只需要傳回 Blob 資料流程的參考,IndexBean
可用以將內容串流至瀏覽器。
以此程式碼取代 read
,並儲存您的工作。
public InputStream read(String name) {
BlobClient blobClient = blobContainerClient.getBlobClient(name);
return blobClient.openInputStream();
}
在 Azure 中部署並執行
您的應用程式完成了。 部署它並查看其運作。
建立 App Service 應用程式,並使用您儲存體帳戶連接字串和容器名稱的應用程式設定進行設定。 使用
az storage account show-connection-string
取得儲存體帳戶的連接字串,並將容器的名稱設定為files
。應用程式名稱必須是全域唯一的。 選擇您自己的名稱以填入
<your-unique-app-name>
。 使用先前建立的儲存體帳戶名稱來取代<your-unique-storage-account-name>
。 在 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
部署應用程式。 下列命令會將網站發佈到 pub 資料夾、將其壓縮成 site.zip,並將 ZIP 檔案部署至 App Service。
注意
在執行下列命令之前,請確定殼層仍在 mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start 目錄中。 您可以使用
cd mslearn-store-data-in-azure/store-app-data-with-azure-blob-storage/src/start
將目錄變更到此位置。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>
若要查看正在執行的應用程式,在瀏覽器中開啟
https://<your-unique-app-name>.azurewebsites.net
。 它看起來應該像下列的圖像。嘗試上傳和下載一些檔案,以測試應用程式。 上傳一些檔案之後,若要查看容器中的 Blob,請在殼層中執行下列程式碼。 將
<your-unique-storage-account-name>
取代為您稍早在課程模組中建立的儲存體帳戶名稱:az storage blob list --account-name <your-unique-storage-account-name> --container-name files --query [].{Name:name} --output table
您的應用程式完成了。 部署它並查看其運作。 使用適用於 Azure App Service 的 Maven 外掛程式來建立 App Service 應用程式、加以設定並進行部署。
在編輯器中,開啟 pom.xml 檔案,並在
build
XML 標籤下新增下列plugins
。<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>
下列命令會為適用於 Azure App Service 的 Maven 外掛程式準備環境變數。 使用
az storage account show-connection-string
擷取儲存體帳戶的連接字串、使用az account show
擷取訂用帳戶識別碼,並設定區域、定價、容器名稱和應用程式名稱。 應用程式名稱必須是全域唯一的。 選擇您自己的名稱以填入<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
提示
部署真實世界 Java 應用程式的最低建議層是任何進階 V2 服務方案。
部署應用程式。 下列命令會在 ROOT.war 中建置應用程式,並將 WAR 檔案部署到 App Service。 適用於 Azure App Service 的 Maven 外掛程式會在第一次嘗試部署時佈建資源。
注意
在執行下列命令之前,請確定殼層仍在 mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start 目錄中。 您可以使用
cd mslearn-store-data-in-azure/store-java-ee-application-data-with-azure-blob-storage/start
將目錄變更到此位置。mvn clean package azure-webapp:deploy
若要查看正在執行的應用程式,在瀏覽器中開啟
https://<your-unique-app-name>.azurewebsites.net
。 它看起來應該像下列的圖像。提示
本課程模組會使用 Maven 外掛程式進行Azure App 服務,在 Azure App 服務上的 Tomcat 9 上部署應用程式。 若要瞭解其他選項,請參閱本課程模組結尾的 [進一步閱讀] 一節。
嘗試上傳和下載一些檔案,以測試應用程式。 上傳一些檔案之後,若要查看容器中的 Blob,請在殼層中執行下列程式碼。
az storage blob list --account-name <your-unique-storage-account-name> --container-name files --query [].{Name:name} --output table