Spring Cloud Azure 资源处理

本文 适用于:✅ 版本 4.19.0 ✅ 版本 5.19.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>

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

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

提示

我们还提供 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的可配置属性:

财产 违约 描述
spring.cloud.azure.storage.blob.enabled 一个值,该值指示是否启用了 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 存储帐户名称。

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

财产 违约 描述
spring.cloud.azure.storage.fileshare.enabled 一个值,该值指示是否启用了 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 资源。

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

  • 对于位置搜索,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");

使用资源进行处理

从特定资源下载数据

可以使用 getInputStream()Resource 方法从 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;

//...

// 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 Resource 强制转换为 WritableResource,将资源上传到 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 存储库。