Bitzsoft.Integrations.FileStorage.Azure 1.0.0-alpha.1

This is a prerelease version of Bitzsoft.Integrations.FileStorage.Azure.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package Bitzsoft.Integrations.FileStorage.Azure --version 1.0.0-alpha.1
                    
NuGet\Install-Package Bitzsoft.Integrations.FileStorage.Azure -Version 1.0.0-alpha.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Bitzsoft.Integrations.FileStorage.Azure" Version="1.0.0-alpha.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Bitzsoft.Integrations.FileStorage.Azure" Version="1.0.0-alpha.1" />
                    
Directory.Packages.props
<PackageReference Include="Bitzsoft.Integrations.FileStorage.Azure" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Bitzsoft.Integrations.FileStorage.Azure --version 1.0.0-alpha.1
                    
#r "nuget: Bitzsoft.Integrations.FileStorage.Azure, 1.0.0-alpha.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Bitzsoft.Integrations.FileStorage.Azure@1.0.0-alpha.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Bitzsoft.Integrations.FileStorage.Azure&version=1.0.0-alpha.1&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Bitzsoft.Integrations.FileStorage.Azure&version=1.0.0-alpha.1&prerelease
                    
Install as a Cake Tool

Bitzsoft.Integrations.FileStorage.Azure

Azure Blob Storage 文件存储实现。

功能特性

  • 完整实现 IFileStore 接口:覆盖存储桶管理、文件读写、删除、预签名 URL 等核心操作
  • SAS 令牌预签名 URL:通过 Azure SharedKey 生成 Blob SAS 下载 / 上传地址,无需暴露存储账户密钥给客户端
  • 配置提供器模式:通过 IAzureBlobConfigProvider 抽象配置获取,支持静态配置或动态配置中心
  • 自动创建存储桶:保存文件时若目标容器不存在将自动创建

注意事项

  • CopyFileAsyncMoveFileAsync 当前抛出 NotImplementedException,后续版本将实现
  • 预签名上传 URL 生成需要配置 AccountKey(SharedKey 凭证)

安装

.NET CLI

dotnet add package Bitzsoft.Integrations.FileStorage.Azure

PackageReference

<PackageReference Include="Bitzsoft.Integrations.FileStorage.Azure" Version="1.0.0" />

配置

appsettings.json

{
  "AzureBlob": {
    "ConnectionString": "DefaultEndpointsProtocol=https;AccountName=mystorageaccount;AccountKey=your-account-key;EndpointSuffix=core.windows.net",
    "AccountKey": "your-account-key",
    "DefaultBucketName": "my-app-container",
    "UploadUrlExpiration": 3600,
    "DownloadUrlExpiration": 3600
  }
}
配置项 说明 默认值
ConnectionString Azure Blob Storage 连接字符串 --
AccountKey 存储账户密钥,用于生成 SAS 令牌 --
DefaultBucketName 默认容器名称,Args 中未指定 BucketName 时使用 --
UploadUrlExpiration 上传 SAS 地址过期时间(秒) 3600
DownloadUrlExpiration 下载 SAS 地址过期时间(秒) 3600

注册服务

基础注册

using Bitzsoft.Integrations.FileStorage;
using Bitzsoft.Integrations.FileStorage.Azure;
using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();

// 注册文件名 / 存储桶名称处理器工厂
services.AddSingleton<IFileNameProcessorFactory, DefaultFileNameProcessorFactory>();
services.AddSingleton<IBucketNameProcessorFactory, DefaultBucketNameProcessorFactory>();

// 注册 Azure Blob 配置
services.AddSingleton<IAzureBlobConfigProvider, AzureBlobConfigProvider>();

// 注册文件存储服务
services.AddSingleton<IAzureBlobFileStore, AzureFileStore>();
services.AddSingleton<IFileStore>(sp => sp.GetRequiredService<IAzureBlobFileStore>());

从 IConfiguration 绑定配置

using Bitzsoft.Integrations.FileStorage;
using Bitzsoft.Integrations.FileStorage.Azure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();

var services = new ServiceCollection();

services.AddSingleton<IFileNameProcessorFactory, DefaultFileNameProcessorFactory>();
services.AddSingleton<IBucketNameProcessorFactory, DefaultBucketNameProcessorFactory>();

// 从配置节绑定 AzureOptions
services.AddSingleton<IAzureBlobConfigProvider>(sp =>
{
    var options = configuration.GetSection("AzureBlob").Get<AzureOptions>();
    return new AzureBlobConfigProvider(options);
});

services.AddSingleton<IAzureBlobFileStore, AzureFileStore>();
services.AddSingleton<IFileStore>(sp => sp.GetRequiredService<IAzureBlobFileStore>());

使用 IOptions 模式

using Bitzsoft.Integrations.FileStorage;
using Bitzsoft.Integrations.FileStorage.Azure;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

var services = new ServiceCollection();

services.AddSingleton<IFileNameProcessorFactory, DefaultFileNameProcessorFactory>();
services.AddSingleton<IBucketNameProcessorFactory, DefaultBucketNameProcessorFactory>();

// 配置选项
services.Configure<AzureOptions>(
    configuration.GetSection("AzureBlob"));

// AzureBlobConfigProvider 内部通过 IOptions<AzureOptions> 获取配置
services.AddSingleton<IAzureBlobConfigProvider, AzureBlobConfigProvider>();
services.AddSingleton<IAzureBlobFileStore, AzureFileStore>();
services.AddSingleton<IFileStore>(sp => sp.GetRequiredService<IAzureBlobFileStore>());

使用示例

保存文件并生成 SAS 下载链接

using Bitzsoft.Integrations.FileStorage;
using Bitzsoft.Integrations.FileStorage.Azure;

public class DocumentService
{
    private readonly IFileStore _fileStore;

    public DocumentService(IFileStore fileStore)
    {
        _fileStore = fileStore;
    }

    public async Task<string> UploadAndGetDownloadUrlAsync(
        Stream documentStream, string documentName)
    {
        // 保存文件到默认容器
        var result = await _fileStore.SaveFileAsync(
            documentStream, documentName);

        // 生成带 SAS 令牌的下载链接
        var downloadUrl = await _fileStore.GenerateDownloadUrlAsync(
            result.FilePath);

        return downloadUrl;
    }
}

指定容器保存文件

using Bitzsoft.Integrations.FileStorage;
using Bitzsoft.Integrations.FileStorage.Azure;

public class AvatarService
{
    private readonly IFileStore _fileStore;

    public AvatarService(IFileStore fileStore)
    {
        _fileStore = fileStore;
    }

    public async Task<FileResult> SaveAvatarAsync(
        Stream imageStream, string userId, string fileExtension)
    {
        var args = new SaveFileArgs($"avatars/{userId}.{fileExtension}", imageStream)
        {
            BucketName = "user-uploads",
            ContentType = $"image/{fileExtension}"
        };

        return await _fileStore.SaveFileAsync(args);
    }
}

生成客户端直传 URL

using Bitzsoft.Integrations.FileStorage;
using Bitzsoft.Integrations.FileStorage.Azure;

public class UploadPreparationService
{
    private readonly IFileStore _fileStore;

    public UploadPreparationService(IFileStore fileStore)
    {
        _fileStore = fileStore;
    }

    /// <summary>
    /// 生成 SAS 直传 URL,供前端通过 PUT 请求直接上传到 Azure Blob
    /// </summary>
    public async Task<DirectUploadParam> PrepareDirectUploadAsync(
        string blobName, string containerName)
    {
        var args = new GenerateUploadUrlArgs(blobName)
        {
            BucketName = containerName
        };

        // 返回的 DirectUploadParam.Url 包含完整的 SAS 查询参数
        // 前端使用 PUT 请求直接上传
        var uploadParam = await _fileStore.GenerateUploadUrlAsync(args);
        return uploadParam;
    }
}

存储桶(容器)管理

using Bitzsoft.Integrations.FileStorage;
using Bitzsoft.Integrations.FileStorage.Azure;

public class ContainerManager
{
    private readonly IFileStore _fileStore;

    public ContainerManager(IFileStore fileStore)
    {
        _fileStore = fileStore;
    }

    public async Task EnsureContainerExistsAsync(string containerName)
    {
        var exists = await _fileStore.BucketExistsAsync(containerName);
        if (!exists)
        {
            await _fileStore.CreateBucketAsync(containerName);
        }
    }

    public async Task RemoveContainerAsync(string containerName)
    {
        var exists = await _fileStore.BucketExistsAsync(containerName);
        if (exists)
        {
            await _fileStore.DeleteBucketAsync(containerName);
        }
    }
}

从远程 URL 下载文件到 Azure Blob

using Bitzsoft.Integrations.FileStorage;
using Bitzsoft.Integrations.FileStorage.Azure;

public class ExternalFileSyncService
{
    private readonly IFileStore _fileStore;

    public ExternalFileSyncService(IFileStore fileStore)
    {
        _fileStore = fileStore;
    }

    public async Task<FileResult> ImportFromUrlAsync(
        string sourceUrl, string saveAs, string containerName)
    {
        var args = new SaveFileByUrlArgs(saveAs, sourceUrl)
        {
            BucketName = containerName
        };

        return await _fileStore.SaveFileByUrlAsync(args);
    }
}

核心类型一览

类型 说明
IAzureBlobFileStore Azure Blob 文件存储接口,继承 IFileStore
AzureFileStore 默认实现类
AzureOptions Azure Blob Storage 连接配置
IAzureBlobConfigProvider 配置提供器接口
AzureBlobConfigProvider 默认配置提供器(支持 IOptions<AzureOptions>

依赖

相关包

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on Bitzsoft.Integrations.FileStorage.Azure:

Package Downloads
Bitzsoft.Integrations.All

Bitzsoft 第三方集成聚合包 — 包含全部 Integration 模块

Bitzsoft.Integrations.FileStorage.All

多云文件存储聚合包 — 包含 Aliyun / Azure / AWS / MinIO / 腾讯云 / 华为云 / 七牛云 / 又拍云 / 金山云 / NAS 全部实现

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0-alpha.7 56 6/16/2026
1.0.0-alpha.6 60 6/16/2026
1.0.0-alpha.5 58 6/14/2026
1.0.0-alpha.3 61 6/7/2026
1.0.0-alpha.2 60 5/29/2026
1.0.0-alpha.1 54 5/28/2026