Spring Cloud Azure 资源处理

本文适用于: ✔️版本 4.14.0 ✔️ 版本 5.8.0

Spring 项目提供了一个 Spring Resources 抽象,用于访问许多低级别资源。 该项目提供类似 ResourceResourceLoaderResourcePatternResolver. Spring Cloud Azure 为 Azure 存储 服务实现这些接口,使你能够使用 Spring 编程模型与 Azure 存储 Blob 和文件共享进行交互。 Spring Cloud Azure 提供spring-cloud-azure-starter-storage-blobspring-cloud-azure-starter-storage-file-share自动配置Azure 存储 Blob 和Azure 存储文件共享。

下表列出了Azure 存储相关库:

初学者 服务 说明
spring-cloud-azure-starter-storage-blob Azure 存储 Blob 允许在块 blob 中大规模存储和访问非结构化数据。
spring-cloud-azure-starter-storage-file-share Azure 存储文件共享 提供完全托管的云文件共享,可通过行业标准服务器消息块 (SMB) 协议从任何位置进行访问。

依赖项设置

<dependencies>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-storage-blob</artifactId>
    </dependency>
    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-storage-file-share</artifactId>
    </dependency>
</dependencies>

spring-cloud-azure-starter-storage-blob仅当使用 Azure 存储 Blob 时,才需要依赖项。

spring-cloud-azure-starter-storage-file-share仅当使用Azure 存储文件共享时,才需要依赖项。

提示

我们还提供支持spring-cloud-azure-starter-storage存储的所有功能。 如果选择使用它, spring.cloud.azure.storage.enable 则为要配置的属性,默认值为 true。 然后 spring.cloud.azure.storage.<storage-service>.enable ,可以使用此功能来禁用不需要的服务。

配置

注意

如果使用安全主体通过 Microsoft Entra ID 进行身份验证和授权来访问 Azure 资源,请确保已向安全主体授予访问 Azure 资源的足够权限。 有关详细信息,请参阅使用 Microsoft Entra ID 授予访问权限

下表列出了可配置 spring-cloud-azure-starter-storage-blob的属性:

properties 默认 说明
spring.cloud.azure.storage.blob.enabled true 一个值,该值指示是否启用了Azure Blob 存储服务。
spring.cloud.azure.storage.blob.endpoint 要连接到Azure Blob 存储的 URI。
spring.cloud.azure.storage.blob.account-key 要连接到Azure Blob 存储的私钥。
spring.cloud.azure.storage.blob.account-name Azure 存储 Blob 帐户名称。

下表列出了可配置 spring-cloud-azure-starter-storage-file-share的属性:

properties 默认 说明
spring.cloud.azure.storage.fileshare.enabled true 一个值,该值指示是否启用了 Azure 文件存储服务。
spring.cloud.azure.storage.fileshare.endpoint 要连接到 Azure 文件存储的 URI。
spring.cloud.azure.storage.fileshare.account-key 要连接到 Azure 文件存储的私钥。
spring.cloud.azure.storage.fileshare.account-name Azure 存储文件共享帐户名称。

基本用法

将以下属性添加到 application.yml 文件

spring:
  cloud:
    azure:
      storage:
        blob:
          account-name: ${STORAGE_ACCOUNT_NAME}
          account-key: ${STORAGE_ACCOUNT_KEY}
          endpoint: ${STORAGE_BLOB_ENDPOINT}
        fileshare:
          account-name: ${STORAGE_ACCOUNT_NAME}
          account-key: ${STORAGE_ACCOUNT_KEY}
          endpoint:  ${STORAGE_FILESHARE_ENDPOINT}

获取资源

使用 @Value

可以使用批注 @Value("azure-blob://[your-container-name]/[your-blob-name]") 自动连接 Blob 资源,如以下示例所示:

@Value("azure-blob://[your-container-name]/[your-blob-name]")
private Resource storageBlobResource;

可以使用批注 @Value("azure-file://[your-fileshare-name]/[your-file-name]") 自动连接文件资源,如以下示例所示:

@Value("azure-file://[your-fileshare-name]/[your-file-name]")
private Resource storageFileResource;

使用 ResourceLoader 获取资源

@Autowired
private ResourceLoader resourceLoader;
...
// Get a BlobResource.
Resource storageBlobResource = resourceLoader.getResource("azure-blob://[your-container-name]/[your-blob-name]");

// Get a FileResource.
Resource storageFileResource = resourceLoader.getResource("azure-file://[your-fileshare-name]/[your-file-name]");

通过搜索模式获取资源

可以使用实现类 ResourcePatternResolver 搜索资源。 用于 AzureStorageBlobProtocolResolver 搜索 blob 资源和 AzureStorageFileProtocolResolver 搜索 file 资源。

  • 对于模式搜索,应 searchPatternazure-blob://azure-file://. 例如, azure-blob://**/** 表示列出所有容器中的所有 Blob,以及 azure-blob://demo-container/** 列出容器中的所有 Blob demo-container ,包括任何子文件夹。

  • 对于位置搜索, searchLocation 应以 azure-blob://azure-file:// 剩余文件路径开头,否则将引发异常。

@Autowired
private AzureStorageBlobProtocolResolver azureStorageBlobProtocolResolver;

@Autowired
private AzureStorageFileProtocolResolver azureStorageFileProtocolResolver;

// Get all text blobs.
Resource[] blobTextResources = azureStorageBlobProtocolResolver.getResources("azure-blob://[container-pattern]/*.txt");

// Get all text files.
Resource[] fileTextResources = azureStorageFileProtocolResolver.getResources("azure-file://[fileshare-pattern]/*.txt");

使用资源进行处理

从特定资源下载数据

可以使用以下方法Resource从 Azure 存储 Blob 或文件共享getInputStream()下载资源。

@Value("azure-blob://[your-container-name]/[your-blob-name]")
private Resource storageBlobResource;

@Value("azure-file://[your-fileshare-name]/[your-file-name]")
private Resource storageFileResource;

//...

// Download data as a stream from a blob resource.
InputStream inputblobStream = storageBlobResource.getInputStream();

// Download data as a stream from a file resource.
InputStream inputfileStream = storageFileResource.getInputStream();

将数据上传到特定资源

可以通过将 Spring ResourceWritableResource强制转换为 Azure Blob 或文件存储将资源上传到 Azure Blob 或文件存储,如以下示例所示:

@Value("azure-blob://[your-container-name]/[your-blob-name]")
private Resource storageBlobResource;

@Value("azure-file://[your-fileshare-name]/[your-file-name]")
private Resource storageFileResource;

String data = "sampledata";

// Upload string data to a blob.
try (OutputStream blobos = ((WritableResource) this.storageBlobResource).getOutputStream()) {
    blobos.write(data.getBytes());
}

// Upload string data to a file.
try (OutputStream fileos = ((WritableResource) this.storageFileResource).getOutputStream()) {
    fileos.write(data.getBytes());
}

多部分上传

大于 4 MiB 的文件将并行上传到Azure 存储。

示例

请参阅 GitHub 上的 storage-blob-samplestorage-file-sample 存储库。