快速入門:適用於 JAVA 的 Azure Blob 儲存體用戶端程式庫

開始使用適用於 JAVA 的 Azure Blob 儲存體用戶端程式庫管理 Blob 和容器。 請遵循下列步驟來安裝套件,並試用基本工作的程式碼範例。

提示

如果在 Spring 應用程式中使用 Azure 儲存體資源,建議考慮將 Spring Cloud Azure 作為替代方案。 Spring Cloud Azure 是開放原始碼專案,可將 Spring 和 Azure 服務無縫整合。 若要深入了解 Spring Cloud Azure,以及查看使用 Blob 儲存體的範例,請參閱將檔案上傳至 Azure 儲存體 Blob

API 參考文件 | 程式庫來源程式碼 | 套件 (Maven) | 範例

必要條件

設定

本節會引導您準備專案以搭配使用適用於 JAVA 的 Azure Blob 儲存體用戶端程式庫。

建立專案

建立名為 blob-quickstart 的 JAVA 應用程式。

  1. 在主控台視窗中 (例如 PowerShell 或 Bash),使用 Maven 建立名為 blob-quickstart 的新主控台應用程式。 鍵入下列 mvn 命令,以建立 "Hello world!"Java 專案。

    mvn archetype:generate `
        --define interactiveMode=n `
        --define groupId=com.blobs.quickstart `
        --define artifactId=blob-quickstart `
        --define archetypeArtifactId=maven-archetype-quickstart `
        --define archetypeVersion=1.4
    
  2. 產生專案的輸出應該看起來像這樣:

    [INFO] Scanning for projects...
    [INFO]
    [INFO] ------------------< org.apache.maven:standalone-pom >-------------------
    [INFO] Building Maven Stub Project (No POM) 1
    [INFO] --------------------------------[ pom ]---------------------------------
    [INFO]
    [INFO] >>> maven-archetype-plugin:3.1.2:generate (default-cli) > generate-sources @ standalone-pom >>>
    [INFO]
    [INFO] <<< maven-archetype-plugin:3.1.2:generate (default-cli) < generate-sources @ standalone-pom <<<
    [INFO]
    [INFO]
    [INFO] --- maven-archetype-plugin:3.1.2:generate (default-cli) @ standalone-pom ---
    [INFO] Generating project in Batch mode
    [INFO] ----------------------------------------------------------------------------
    [INFO] Using following parameters for creating project from Archetype: maven-archetype-quickstart:1.4
    [INFO] ----------------------------------------------------------------------------
    [INFO] Parameter: groupId, Value: com.blobs.quickstart
    [INFO] Parameter: artifactId, Value: blob-quickstart
    [INFO] Parameter: version, Value: 1.0-SNAPSHOT
    [INFO] Parameter: package, Value: com.blobs.quickstart
    [INFO] Parameter: packageInPathFormat, Value: com/blobs/quickstart
    [INFO] Parameter: version, Value: 1.0-SNAPSHOT
    [INFO] Parameter: package, Value: com.blobs.quickstart
    [INFO] Parameter: groupId, Value: com.blobs.quickstart
    [INFO] Parameter: artifactId, Value: blob-quickstart
    [INFO] Project created from Archetype in dir: C:\QuickStarts\blob-quickstart
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  7.056 s
    [INFO] Finished at: 2019-10-23T11:09:21-07:00
    [INFO] ------------------------------------------------------------------------
        ```
    
    
  3. 切換至新建立的 [blob-quickstart] 資料夾。

    cd blob-quickstart
    
  4. blob-quickstart 目錄內,建立另一個名為 data 的目錄。 這是將建立和儲存 Blob 資料檔案的資料夾。

    mkdir data
    

安裝套件

在文字編輯器中開啟 pom.xml 檔案。

新增 azure-sdk-bom,相依於最新版本的程式庫。 在下列程式碼片段中,將 {bom_version_to_target} 預留位置取代為版本號碼。 使用 azure-sdk-bom 可讓您不必指定每個個別相依性的版本。 若要深入了解 BOM,請參閱 Azure SDK BOM 讀我檔案 (英文)。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.azure</groupId>
            <artifactId>azure-sdk-bom</artifactId>
            <version>{bom_version_to_target}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

然後,將下列相依性元素新增至相依性群組。 需要 azure-identity 相依性才能對 Azure 服務進行無密碼連線。

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-storage-blob</artifactId>
</dependency>
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
</dependency>

設定應用程式架構

在專案目錄中,執行步驟來建立應用程式基本結構:

  1. 瀏覽至 /src/main/java/com/blobs/quickstart 目錄
  2. 在您的編輯器中開啟 App.java 檔案
  3. 刪除 System.out.println("Hello world!");
  4. 加入必要的 import 指示詞

程式碼應該類似此架構:

package com.blobs.quickstart;

/**
 * Azure Blob Storage quickstart
 */
import com.azure.identity.*;
import com.azure.storage.blob.*;
import com.azure.storage.blob.models.*;
import java.io.*;

public class App
{
    public static void main(String[] args) throws IOException
    {
        // Quickstart code goes here
    }
}

物件模型

Azure Blob 儲存體已針對儲存大量非結構化資料進行最佳化。 非結構化資料不遵守特定資料模型或定義,例如文字或二進位資料。 Blob 儲存體提供三種類型資源:

  • 儲存體帳戶
  • 儲存體帳戶中的容器
  • 容器中的 Blob

下圖顯示資源之間的關係。

Diagram of Blob storage architecture

使用下列 Java 類別與這些資源互動:

  • BlobServiceClientBlobServiceClient 類別可讓您操作 Azure 儲存體資源和 Blob 容器。 儲存體帳戶會為 Blob 服務提供最上層命名空間。
  • BlobServiceClientBuilderBlobServiceClientBuilder 類別會提供 Fluent 產生器 API,以協助設定和具現化 BlobServiceClient 物件。
  • BlobContainerClientBlobContainerClient 類別可讓您操作 Azure 儲存體容器及其 Blob。
  • BlobClientBlobClient 類別可讓您操作 Azure 儲存體 Blob。
  • BlobItem 類別代表從呼叫 listBlobsBlobItem 傳回的個別 Blob。

程式碼範例

這些範例程式碼片段示範如何使用適用於 JAVA 的 Azure Blob 儲存體用戶端程式庫來執行下列動作:

重要

請確定您具有 pom.xml 中的正確相依性,以及讓程式碼範例運作的必要指示詞 (如設定一節所列)。

驗證 Azure,並授權存取 Blob 資料

應用程式向 Azure Blob 儲存體提出的要求必須經過授權。 在程式碼中實作對 Azure 服務 (包括 Blob 儲存體) 的無密碼連線時,建議使用 Azure.Identity 用戶端程式庫提供的 DefaultAzureCredential 類別。

您也可以使用帳戶存取金鑰,以授權對 Azure Blob 儲存體的要求。 不過,應該謹慎使用此方法。 開發人員必須盡可能避免在不安全的地方公開存取金鑰。 任何擁有存取金鑰的人都可以授權執行目標為儲存體帳戶的要求,而且可實質存取所有資料。 DefaultAzureCredential 提供優於帳戶金鑰的管理和安全性優點,允許無密碼驗證。 下列範例示範這兩個選項。

DefaultAzureCredential 為適用於 JAVA 的 Azure 身分識別用戶端程式庫所提供的類別。 DefaultAzureCredential 支援多個驗證方法,並在執行階段判斷應該使用哪個方法。 此方法可讓您的應用程式在不同的環境中 (本機或實際執行環境) 使用不同的驗證方法,而不需要實作環境特有的程式碼。

Azure 身分識別程式庫概觀中可以找到 DefaultAzureCredential 尋找認證時的順序和位置。

例如,應用程式在本機開發時可以使用 Visual Studio Code 登入認證進行驗證。 應用程式在部署至 Azure 之後就可以使用受控識別。 此轉移不需要變更程式碼。

將角色指派給 Microsoft Entra 使用者帳戶

在本機開發時,請確定存取 Blob 資料的使用者帳戶具有正確的權限。 您需要儲存體 Blob 資料參與者才能讀取和寫入 Blob 資料。 若要指派此角色給您自己,您需要被指派使用者存取管理員角色,或另一個包含 Microsoft.Authorization/roleAssignments/write 動作的角色。 您可以使用 Azure 入口網站、Azure CLI 或 Azure PowerShell,將 Azure RBAC 角色指派給使用者。 您可以在範圍概觀頁面上深入了解角色指派的可用範圍。

在此案例中,您會將權限指派給使用者帳戶 (以儲存體帳戶為範圍),以遵循最低權限原則。 此做法只為使用者提供所需的最低權限,並建立更安全的實際執行環境。

下列範例將儲存體 Blob 資料參與者角色指派給使用者帳戶,以針對儲存體帳戶中的 Blob 資料提供讀取和寫入存取權。

重要

在大部分情況下,角色指派在 Azure 中傳播只需要一兩分鐘,但在罕見情況下,可能需要長達八分鐘。 如果您第一次執行程式碼時收到驗證錯誤,請稍候片刻再試一次。

  1. 在 Azure 入口網站中,使用主要搜尋列或左側導覽找出您的儲存體帳戶。

  2. 在儲存體帳戶概觀頁面上,從左側功能表中選取 [存取控制 (IAM)]

  3. 在 [存取控制 (IAM)] 頁面上,選取 [角色指派] 索引標籤。

  4. 從頂端功能表選取 [+ 新增],然後從產生的下拉功能表中選取 [新增角色指派]

    A screenshot showing how to assign a role.

  5. 使用搜尋方塊,從結果篩選出所需的角色。 在此範例中,搜尋「儲存體 Blob 資料參與者」,選取相符的結果,然後選擇 [下一步]

  6. 在 [存取權指派對象為] 下,選取 [使用者、群組或服務主體],然後選擇 [+ 選取成員]

  7. 在對話方塊中,搜尋 Microsoft Entra 使用者名稱 (通常是您的 user@domain 電子郵件地址),然後在對話方塊底部選擇 [選取]

  8. 選取 [檢閱 + 指派] 以移至最終頁面,然後再次選取 [檢閱 + 指派] 以完成此程序。

使用 DefaultAzureCredential 登入並將應用程式程式碼連線至 Azure

您可以使用下列步驟來授權存取儲存體帳戶中的資料:

  1. 請確定使用您在儲存體帳戶上指派角色的相同 Microsoft Entra 帳戶進行驗證。 您可以透過 Azure CLI、Visual Studio Code 或 Azure PowerShell 進行驗證。

    使用下列命令透過 Azure CLI 登入 Azure:

    az login
    
  2. 若要使用 DefaultAzureCredential,請確定已在 pom.xml 中新增 azure-identity 相依性:

    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-identity</artifactId>
    </dependency>
    
  3. 將此程式碼新增到 Main 方法。 程式碼在本機工作站上執行時,會根據您優先用來登入的工具 (例如 Azure CLI 或 Visual Studio Code),使用其開發人員認證向 Azure 進行驗證。

    /*
     * The default credential first checks environment variables for configuration
     * If environment configuration is incomplete, it will try managed identity
     */
    DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder().build();
    
    // Azure SDK client builders accept the credential as a parameter
    // TODO: Replace <storage-account-name> with your actual storage account name
    BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
            .endpoint("https://<storage-account-name>.blob.core.windows.net/")
            .credential(defaultCredential)
            .buildClient();
    
  4. 請務必在 BlobServiceClient 的 URI 中更新儲存體帳戶名稱。 您可以在 Azure 入口網站的概觀頁面上找到儲存體帳戶名稱。

    A screenshot showing how to find the storage account name.

    注意

    部署至 Azure 時,您可以使用上述程式碼,從 Azure 中執行的應用程式授權對 Azure 儲存體的要求。 不過,在 Azure 中,您必須在應用程式中啟用受控識別。 然後,將您的儲存體帳戶設定為允許該受控識別進行連線。 如需在 Azure 服務之間設定此連線的詳細指示,請參閱從 Azure 託管應用程式進行驗證教學課程。

建立容器

決定新容器的名稱。 下列程式碼會將 UUID 值附加到容器名稱,以確保該值是唯一的。

重要

容器名稱必須是小寫字母。 如需為容器和 Blob 命名的詳細資訊,請參閱命名和參考容器、Blob 及中繼資料

接下來,建立 BlobContainerClient 類別的執行個體,然後呼叫 create 方法,以實際在您的儲存體帳戶中建立容器。

將此程式碼加入到 Main 方法的結尾處:

// Create a unique name for the container
String containerName = "quickstartblobs" + java.util.UUID.randomUUID();

// Create the container and return a container client object
BlobContainerClient blobContainerClient = blobServiceClient.createBlobContainer(containerName);

若要深入了解建立容器的相關資訊,以及探索更多程式碼範例,請參閱使用 JAVA 建立 Blob 容器

將 Blob 上傳至容器

將此程式碼加入到 Main 方法的結尾處:

// Create a local file in the ./data/ directory for uploading and downloading
String localPath = "./data/";
String fileName = "quickstart" + java.util.UUID.randomUUID() + ".txt";

// Get a reference to a blob
BlobClient blobClient = blobContainerClient.getBlobClient(fileName);

// Write text to the file
FileWriter writer = null;
try
{
    writer = new FileWriter(localPath + fileName, true);
    writer.write("Hello, World!");
    writer.close();
}
catch (IOException ex)
{
    System.out.println(ex.getMessage());
}

System.out.println("\nUploading to Blob storage as blob:\n\t" + blobClient.getBlobUrl());

// Upload the blob
blobClient.uploadFromFile(localPath + fileName);

此程式碼片段會完成下列步驟:

  1. 在本機 data 目錄中建立一個文字檔。
  2. 建立容器一節的容器上呼叫 getBlobClient 方法,以取得 BlobClient 物件的參考。
  3. 呼叫 uploadFromFile 方法,將本機文字檔上傳至 Blob。 如果 Blob 不存在,此方法會建立 Blob,若已存在,則不會加以覆寫。

若要深入了解上傳 Blob 的相關資訊,以及探索更多程式碼範例,請參閱使用 JAVA 上傳 Blob

列出容器中的 Blob

呼叫 list_blobs 方法,以列出容器中的 Blob。 在此情況下,只有一個 Blob 已新增至容器,因此清單作業只會傳回該 Blob。

將此程式碼加入到 Main 方法的結尾處:

System.out.println("\nListing blobs...");

// List the blob(s) in the container.
for (BlobItem blobItem : blobContainerClient.listBlobs()) {
    System.out.println("\t" + blobItem.getName());
}

若要深入了解列出 Blob 的相關資訊,以及探索更多程式碼範例,請參閱使用 JAVA 列出 Blob

下載 Blob

呼叫 downloadToFile 方法,以下載先前建立的 Blob。 此範例程式碼會將 "DOWNLOAD" 的尾碼加入至檔案名稱,讓您可以在本機檔案系統中看到這兩個檔案。

將此程式碼加入到 Main 方法的結尾處:

// Download the blob to a local file

// Append the string "DOWNLOAD" before the .txt extension for comparison purposes
String downloadFileName = fileName.replace(".txt", "DOWNLOAD.txt");

System.out.println("\nDownloading blob to\n\t " + localPath + downloadFileName);

blobClient.downloadToFile(localPath + downloadFileName);

若要深入了解下載 Blob 的相關資訊,以及探索更多程式碼範例,請參閱使用 JAVA 下載 Blob

刪除容器

下列程式碼會使用 delete 方法移除整個容器,以清除應用程式所建立的資源。 它也會刪除應用程式所建立的本機檔案。

應用程式會在刪除 Blob、容器和本機檔案之前呼叫 System.console().readLine(),藉以暫停使用者輸入。 您可以利用這個機會,在刪除資源之前先確認這些資源已正確建立。

將此程式碼加入到 Main 方法的結尾處:

File downloadedFile = new File(localPath + downloadFileName);
File localFile = new File(localPath + fileName);

// Clean up resources
System.out.println("\nPress the Enter key to begin clean up");
System.console().readLine();

System.out.println("Deleting blob container...");
blobContainerClient.delete();

System.out.println("Deleting the local source and downloaded files...");
localFile.delete();
downloadedFile.delete();

System.out.println("Done");

若要深入了解刪除容器的相關資訊,以及探索更多程式碼範例,請參閱使用 JAVA 刪除及還原 Blob 容器

執行程式碼

此應用程式會在本機資料夾中建立一個測試檔案,並將其上傳到 Blob 儲存體。 範例會接著列出容器中的 Blob,並下載具有新名稱的檔案,您便可比較舊檔案和新檔案。

請遵循步驟來編譯、封裝和執行程式碼

  1. 瀏覽至包含 pom.xml 檔案的目錄,然後使用下列 mvn 命令來編譯專案:
    mvn compile
    
  2. 以可散發格式封裝已編譯的程式碼:
    mvn package
    
  3. 執行下列 mvn 命令以執行應用程式:
    mvn exec:java -D exec.mainClass=com.blobs.quickstart.App -D exec.cleanupDaemonThreads=false
    
    若要簡化執行步驟,您可以將 exec-maven-plugin 新增至 pom.xml 並進行設定,如下所示:
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>exec-maven-plugin</artifactId>
      <version>1.4.0</version>
      <configuration>
        <mainClass>com.blobs.quickstart.App</mainClass>
        <cleanupDaemonThreads>false</cleanupDaemonThreads>
      </configuration>
    </plugin>
    
    使用此組態,您可以使用下列命令來執行應用程式:
    mvn exec:java
    

應用程式的輸出類似於下列範例 (已針對可讀性省略 UUID 值):

Azure Blob Storage - Java quickstart sample

Uploading to Blob storage as blob:
        https://mystorageacct.blob.core.windows.net/quickstartblobsUUID/quickstartUUID.txt

Listing blobs...
        quickstartUUID.txt

Downloading blob to
        ./data/quickstartUUIDDOWNLOAD.txt

Press the Enter key to begin clean up

Deleting blob container...
Deleting the local source and downloaded files...
Done

在開始清除程序之前,請檢查 data 資料夾,找出這兩個檔案。 您可以比較這些檔案,並觀察它們是否相同。

清除資源

驗證檔案並完成測試之後,請按 Enter 鍵,刪除測試檔案,以及在儲存體帳戶中建立的容器。 也可使用 Azure CLI 來刪除資源。

下一步

在本快速入門中,您已了解如何使用 Java 上傳、下載及列出 Blob。

若要查看 Blob 儲存體範例應用程式,請繼續查看: