練習 - Blob 上傳及下載

已完成

若要與 Blob 儲存體中的個別 Blob 互動,請使用 BlobClient 物件。 您可以使用 Blob 的名稱從 Blob 所在的 BlobContainerClient 進行要求來取得 BlobClientBlobClient 具有上傳、下載及管理 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 中部署並執行

您的應用程式完成了。 部署它並查看其運作。

  1. 建立 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
    
  2. 部署應用程式。 下列命令會將網站發佈到 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。 它看起來應該像下列的圖像。

    適用於 C# 的 FileUploader Web 應用程式的螢幕擷取畫面。

  3. 嘗試上傳和下載一些檔案,以測試應用程式。 上傳一些檔案之後,若要查看容器中的 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 應用程式、加以設定並進行部署。

  1. 在編輯器中,開啟 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>
    
  2. 下列命令會為適用於 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 服務方案。

  3. 部署應用程式。 下列命令會在 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。 它看起來應該像下列的圖像。

    適用於 Java 的 FileUploader Web 應用程式的螢幕擷取畫面。

    提示

    本課程模組會使用 Maven 外掛程式進行Azure App 服務,在 Azure App 服務上的 Tomcat 9 上部署應用程式。 若要瞭解其他選項,請參閱本課程模組結尾的 [進一步閱讀] 一節。

  4. 嘗試上傳和下載一些檔案,以測試應用程式。 上傳一些檔案之後,若要查看容器中的 Blob,請在殼層中執行下列程式碼。

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