using Dpz.Core.Entity.Base.PublicStruct;
using Dpz.Core.Shard.Service;

namespace Dpz.Core.Service.ObjectStorage.Services;

/// <summary>
/// 对象存储操作
/// </summary>
public interface IObjectStorageOperation
{
    /// <summary>
    /// 储存筒
    /// </summary>
    string Bucket { get; }

    /// <summary>
    /// 上传文件
    /// </summary>
    /// <param name="stream">文件流</param>
    /// <param name="path">文件夹路径</param>
    /// <param name="filename">文件名</param>
    /// <param name="cancellationToken">传播通知操作应取消的通知令牌</param>
    /// <returns></returns>
    Task<IFileMetadata> UploadAsync(
        Stream stream,
        ICollection<string> path,
        string filename,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 断点续传
    /// </summary>
    /// <param name="file"></param>
    /// <param name="cancellationToken">传播通知操作应取消的通知令牌</param>
    /// <returns></returns>
    Task<FileAddress?> UploadFileAsync(
        CloudFile file,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 上传文件
    /// </summary>
    /// <param name="bytes">bytes</param>
    /// <param name="path">文件夹路径</param>
    /// <param name="filename">文件名</param>
    /// <param name="cancellationToken">传播通知操作应取消的通知令牌</param>
    /// <returns></returns>
    Task<IFileMetadata> UploadAsync(
        byte[] bytes,
        List<string> path,
        string filename,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 下载文件
    /// </summary>
    /// <param name="pathToFile">路径级文件</param>
    /// <param name="cancellationToken">传播通知操作应取消的通知令牌</param>
    /// <returns></returns>
    Task<Stream> DownloadAsync(string pathToFile, CancellationToken cancellationToken = default);

    /// <summary>
    /// 下载文件另存为
    /// </summary>
    /// <param name="pathToFile">路径级文件</param>
    /// <param name="path">保存路径</param>
    /// <param name="cancellationToken">传播通知操作应取消的通知令牌</param>
    /// <returns></returns>
    Task SaveAsAsync(string pathToFile, string path, CancellationToken cancellationToken = default);

    /// <summary>
    /// 删除文件
    /// </summary>
    /// <param name="pathToFile"></param>
    /// <param name="cancellationToken">传播通知操作应取消的通知令牌</param>
    /// <returns></returns>
    Task DeleteAsync(string? pathToFile, CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取目录列表文件和文件夹信息
    /// </summary>
    /// <param name="path">路径</param>
    /// <param name="cancellationToken">传播通知操作应取消的通知令牌</param>
    /// <returns></returns>
    Task<IList<FolderResult>> GetFolderListAsync(
        string path,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 获取文件信息
    /// </summary>
    /// <param name="pathToFile"></param>
    /// <param name="cancellationToken">传播通知操作应取消的通知令牌</param>
    /// <returns></returns>
    Task<FileInformation> GetFileInformationAsync(
        string pathToFile,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 批量上传本地目录下所有文件到远程目录,默认覆盖已有文件
    /// </summary>
    /// <param name="localDirectory">本地目录路径</param>
    /// <param name="remoteDirectory">远程目录路径</param>
    /// <param name="bucket">储存桶名称,为 null 时使用当前 <see cref="Bucket"/> 属性</param>
    /// <param name="cancellationToken">传播通知操作应取消的通知令牌</param>
    /// <returns>成功上传的文件数量</returns>
    Task<int> UploadDirectoryAsync(
        string localDirectory,
        string remoteDirectory,
        string? bucket = null,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 清理云储存中的空目录(删除没有文件的、以 "/" 结尾的零字节 marker 对象)
    /// </summary>
    /// <param name="prefix">限定扫描的根前缀,为 null 时扫描整个储存桶</param>
    /// <param name="cancellationToken">传播通知操作应取消的通知令牌</param>
    /// <returns>删除的空目录数量</returns>
    Task<int> CleanEmptyDirectoriesAsync(
        string? prefix = null,
        CancellationToken cancellationToken = default
    );
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个 对象存储服务接口定义,用于定义云存储操作的标准契约。

接口概述

IObjectStorageOperation 接口定义了与对象存储(如阿里云 OSS、AWS S3、MinIO 等)进行交互的核心操作方法。

主要成员

属性

  • Bucket: 字符串类型,表示当前操作的存储桶(bucket)名称

方法

1. 文件上传方法(3个重载)

  • UploadAsync(Stream, path, filename)

    • 从流上传文件
    • 参数:文件流、文件夹路径集合、文件名
    • 返回:文件元数据信息
  • UploadFileAsync(CloudFile)

    • 断点续传功能
    • 参数:云文件对象
    • 返回:文件地址(可为空)
  • UploadAsync(byte[], path, filename)

    • 从字节数组上传文件
    • 参数:字节数组、路径列表、文件名
    • 返回:文件元数据信息

2. 文件下载方法(2个)

  • DownloadAsync(pathToFile)

    • 下载文件到内存流
    • 返回:文件流
  • SaveAsAsync(pathToFile, path)

    • 下载文件并保存到本地指定路径

3. 文件管理方法

  • DeleteAsync(pathToFile)

    • 删除指定路径的文件
  • GetFileInformationAsync(pathToFile)

    • 获取文件的详细信息
    • 返回:FileInformation 对象
  • GetFolderListAsync(path)

    • 获取指定路径下的文件和文件夹列表
    • 返回:FolderResult 列表

4. 批量操作方法

  • UploadDirectoryAsync(localDirectory, remoteDirectory, bucket?)

    • 批量上传本地目录所有文件到远程目录
    • 支持指定不同的存储桶
    • 返回:成功上传的文件数量
  • CleanEmptyDirectoriesAsync(prefix?)

    • 清理云存储中的空目录
    • 删除零字节的目录标记对象
    • 返回:删除的空目录数量

设计特点

  1. 异步设计:所有方法都是异步的(Task),提高性能
  2. 支持取消:每个方法都支持 CancellationToken,可优雅取消操作
  3. 多种上传方式:支持流、字节数组、断点续传等多种场景
  4. 完整的 CRUD:涵盖创建、读取、删除等基本操作
  5. 批量操作:支持目录级别的批量上传和清理

这个接口为对象存储服务提供了统一的抽象层,便于在不同云存储提供商之间切换实现。

评论加载中...