IFileStorageService.cs 2.67 KB
namespace Rcs.Application.Services
{
    /// <summary>
    /// 文件存储服务接口
    /// </summary>
    public interface IFileStorageService
    {
        /// <summary>
        /// 保存文件
        /// </summary>
        /// <param name="stream">文件流</param>
        /// <param name="fileName">文件名</param>
        /// <param name="subDirectory">子目录(可选)</param>
        /// <param name="cancellationToken">取消令牌</param>
        /// <returns>文件存储信息</returns>
        Task<FileStorageResult> SaveFileAsync(Stream stream, string fileName, string? subDirectory = null, CancellationToken cancellationToken = default);

        /// <summary>
        /// 删除文件
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <param name="cancellationToken">取消令牌</param>
        Task<bool> DeleteFileAsync(string filePath, CancellationToken cancellationToken = default);

        /// <summary>
        /// 获取文件完整路径
        /// </summary>
        /// <param name="relativePath">相对路径</param>
        /// <returns>完整路径</returns>
        string GetFullPath(string relativePath);

        /// <summary>
        /// 验证文件
        /// </summary>
        /// <param name="fileName">文件名</param>
        /// <param name="fileSize">文件大小(字节)</param>
        /// <param name="allowedExtensions">允许的文件扩展名(如:.jpg,.png)</param>
        /// <param name="maxSizeInBytes">最大文件大小(字节)</param>
        /// <returns>验证结果</returns>
        (bool IsValid, string ErrorMessage) ValidateFile(string fileName, long fileSize, string[]? allowedExtensions = null, long? maxSizeInBytes = null);
    }

    /// <summary>
    /// 文件存储结果
    /// </summary>
    public class FileStorageResult
    {
        /// <summary>
        /// 文件名(带扩展名)
        /// </summary>
        public string FileName { get; set; } = string.Empty;

        /// <summary>
        /// 原始文件名
        /// </summary>
        public string OriginalFileName { get; set; } = string.Empty;

        /// <summary>
        /// 相对路径(相对于存储根目录)
        /// </summary>
        public string RelativePath { get; set; } = string.Empty;

        /// <summary>
        /// 完整路径
        /// </summary>
        public string FullPath { get; set; } = string.Empty;

        /// <summary>
        /// 文件大小(字节)
        /// </summary>
        public long FileSize { get; set; }

        /// <summary>
        /// 文件扩展名
        /// </summary>
        public string Extension { get; set; } = string.Empty;
    }
}