文件上传服务设计

多种上传场景分析

本地上传和云上传

本地上传:方便快捷

云上传:通用但要对接API

使用策略模式+工厂模式实现
工厂模式:解决创建对象问题,不同策略对应不同类,通过工厂去实例化类,只需通过枚举传进去使用
C#
//枚举工具类
namespace Model.Enum
{
    public enum UploadMode
    {
        Local = 1,
        Cloud = 2
    }
}
策略模式:策略文件夹FileStategy
Strategy
C#
/// <summary>
    /// 文件操作抽象类
    /// </summary>
    public abstract class Strategy
    {
        public abstract Task<string> UpLoad(List<IFormFile> formFiles);
    }
LocalStrategy
C#
public class LocalStrategy : Strategy
    {
        /// <summary>
        ///实现抽象类、本地上传逻辑
        /// </summary>
        /// <param name="formFiles"></param>
        /// <returns></returns>
        public override async Task<string> UpLoad(List<IFormFile> files)
        {
            var res = await Task.Run(() =>
            {
                List<string> result = new List<string>();
                foreach (var formfile in files)
                {
                    //判断文件长度是否大于0,如果大于0说明存在文件内容
                    if (formfile.Length>0)
                    {
                        var filePath = $"{AppContext.BaseDirectory}/wwwroot";
                        //不能存绝对路径
                        var fileName = $"/{DateTime.Now:yyyyMMddHHmmssffff}{formfile.FileName}";
                        //判断文件夹是否存在,不能用于判断文件是否存在
                        if (!Directory.Exists(filePath))
                        {
                            Directory.CreateDirectory(filePath);
                        }
                        using(var stream = File.Create(filePath + fileName))
                        {
                            formfile.CopyTo(stream);
                        }
                        result.Add(fileName);
                    }
                }
                return string.Join(",",result);
            });
            return res;
        }
    }
CloudStrategy
C#
public class CloudStrategy : Strategy
    {
        public override async Task<string> UpLoad(List<IFormFile> files)
        {
            var res = await Task.Run(() =>
            {
                Mac mac = new Mac("xx", "xx");
                List<string> result = new List<string>();
                foreach (var formfile in files)
                {
                    //判断文件长度是否大于0,如果大于0说明存在文件内容
                    if (formfile.Length > 0)
                    {
                        var filePath = $"{AppContext.BaseDirectory}/wwwroot";
                        //不能存绝对路径
                        var fileName = $"/{DateTime.Now:yyyyMMddHHmmssffff}{formfile.FileName}";
                        //判断文件夹是否存在,不能用于判断文件是否存在
                        if (!Directory.Exists(filePath))
                        {
                            Directory.CreateDirectory(filePath);
                        }
                        using(var stearm = File.Create($"{filePath}/{fileName}"))
                        {
                            formfile.CopyTo(stearm);
                        }
                        //上传文件名
                        string key = fileName;
                        //本地文件路径
                        string filePath_Local = $"{filePath}/{fileName}";
                        //存储空间名
                        string Bucket = "ichiupload";
                        //设置上传策略
                        PutPolicy putPolicy = new PutPolicy();
                        //设置要上传的目标空间
                        putPolicy.Scope = Bucket;
                        //上传策略的过期时间(单位:秒)
                        //putPolicy.SetExpires(3600);
                        //文件上传完成后,在多少天会自动删除
                        putPolicy.DeleteAfterDays = 0;
                        //生成上传Token
                        string token = Auth.CreateUploadToken(mac,putPolicy.ToJsonString());
                        Config config = new Config();
                        //设置上传区域
                        config.Zone = Zone.ZONE_CN_South;
                        //设置http或https上传
                        config.UseHttps = true;
                        config.UseCdnDomains = true;
                        //表单上传
                        FormUploader target = new FormUploader(config);
                        HttpResult httpResult = target.UploadFile(filePath_Local, key, token, null);
                        result.Add(filePath_Local);
                        //删除备份文件夹(先上传到本地然后上传云,删除的本地文件夹)
                        Directory.Delete(filePath,true);
                    }
                    
                }
                return string.Join("",result);
            });
            return res;
        }
    }
FileContext
C#
  //通过上下文调用具体的策略
    public class FileContext
    {
        //通过构造函数传参
        private Strategy _strategy;
        private List<IFormFile> _files;
        public FileContext(Strategy strategy,List<IFormFile> formFiles)
        {
            _files = formFiles;
            _strategy = strategy;
        }
        public async Task<string> ContextInterFace()
        {
            return await _strategy.UpLoad(_files);
        }
    }
FileFactory
C#
/// <summary>
    /// 工厂类负责对象的实例化
    /// </summary>
    public class FileFactory
    {
        public static Strategy CreateStrategy(UploadMode mode)
        {
            switch (mode)
            {
                case UploadMode.Local:
                    return new LocalStrategy();
                case UploadMode.Cloud:
                    return new CloudStrategy();
                default: return new CloudStrategy();
            }
        }
    }

最后实现接口和服务

IFileService
C#
public interface IFileService
    {
        Task<string> Upload(List<IFormFile> formFiles, UploadMode mode);
    }
FileService
C#
 public class FileService : IFileService
    {
        public async Task<string> Upload(List<IFormFile> formFiles, UploadMode mode)
        {
           FileContext fileContext = new FileContext(FileFactory.CreateStrategy(mode),formFiles);
            return await fileContext.ContextInterFace();
        }
    }
1.本地上传功能实现

在策略中编写逻辑

LocalStrategy
C#
public class LocalStrategy : Strategy
    {
        /// <summary>
        ///实现抽象类、本地上传逻辑
        /// </summary>
        /// <param name="formFiles"></param>
        /// <returns></returns>
        public override async Task<string> UpLoad(List<IFormFile> files)
        {
            var res = await Task.Run(() =>
            {
                List<string> result = new List<string>();
                foreach (var formfile in files)
                {
                    //判断文件长度是否大于0,如果大于0说明存在文件内容
                    if (formfile.Length>0)
                    {
                        var filePath = $"{AppContext.BaseDirectory}/wwwroot";
                        //不能存绝对路径
                        var fileName = $"/{DateTime.Now:yyyyMMddHHmmssffff}{formfile.FileName}";
                        //判断文件夹是否存在,不能用于判断文件是否存在
                        if (!Directory.Exists(filePath))
                        {
                            Directory.CreateDirectory(filePath);
                        }
                        using(var stream = File.Create(filePath + fileName))
                        {
                            formfile.CopyTo(stream);
                        }
                        result.Add(fileName);
                    }
                }
                return string.Join(",",result);
            });
            return res;
        }
    }
2.云服务器上传功能实现(七牛云)

创建七牛云账户—>个人中心—>密钥管理

安装SDK,编写上传逻辑

C#
 public class CloudStrategy : Strategy
    {
        public override async Task<string> UpLoad(List<IFormFile> files)
        {
            var res = await Task.Run(() =>
            {
                Mac mac = new Mac("xx", "xx");
                List<string> result = new List<string>();
                foreach (var formfile in files)
                {
                    //判断文件长度是否大于0,如果大于0说明存在文件内容
                    if (formfile.Length > 0)
                    {
                        var filePath = $"{AppContext.BaseDirectory}/wwwroot";
                        //不能存绝对路径
                        var fileName = $"/{DateTime.Now:yyyyMMddHHmmssffff}{formfile.FileName}";
                        //判断文件夹是否存在,不能用于判断文件是否存在
                        if (!Directory.Exists(filePath))
                        {
                            Directory.CreateDirectory(filePath);
                        }
                        using(var stearm = File.Create($"{filePath}/{fileName}"))
                        {
                            formfile.CopyTo(stearm);
                        }
                        //上传文件名
                        string key = fileName;
                        //本地文件路径
                        string filePath_Local = $"{filePath}/{fileName}";
                        //存储空间名
                        string Bucket = "ichiupload";
                        //设置上传策略
                        PutPolicy putPolicy = new PutPolicy();
                        //设置要上传的目标空间
                        putPolicy.Scope = Bucket;
                        //上传策略的过期时间(单位:秒)
                        //putPolicy.SetExpires(3600);
                        //文件上传完成后,在多少天会自动删除
                        putPolicy.DeleteAfterDays = 0;
                        //生成上传Token
                        string token = Auth.CreateUploadToken(mac,putPolicy.ToJsonString());
                        Config config = new Config();
                        //设置上传区域
                        config.Zone = Zone.ZONE_CN_South;
                        //设置http或https上传
                        config.UseHttps = true;
                        config.UseCdnDomains = true;
                        //表单上传
                        FormUploader target = new FormUploader(config);
                        HttpResult httpResult = target.UploadFile(filePath_Local, key, token, null);
                        result.Add(filePath_Local);
                        //删除备份文件夹(先上传到本地然后上传云,删除的本地文件夹)
                        Directory.Delete(filePath,true);
                    }
                    
                }
                return string.Join("",result);
            });
            return res;
        }
    }
订阅评论
提醒
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
滚动至顶部