最新要闻
- 变形积木:以装配式装修助力美团酒店布局“百品、千城、万店”-当前观点
- 马斯克邀请丰田加入特斯拉快充阵营:你们充电太慢了
- 要闻:新一轮油价调整将于6月28日开启 这次又有降价的可能
- Steam客户端大规模更新!新增实用笔记功能 世界热议
- AMD Yes!RX 6650 XT显卡杀到1799元:比N卡更香 天天播资讯
- 贾跃亭团队出身就是不一样!高合HiPhi Y内饰官图发布:平替FF 91
- 世界热文:手机微信出现状态是什么意思(微信出现状态是怎么回事)
- 出庭当晚特朗普与“金主”举行晚宴,筹得200多万美元-世界微头条
- 欠2.4亿罚款又如何?贾跃亭国内“现身”:我不要烧太多钱也能快速成功 环球快讯
- 端午节放假3天自驾方便了!滴滴租车正式上线:跑车、房车全都有
- 全球即时:一机搞定全屋清洁!石头新品洗地机A10 Ultra今晚首销:到手价3399元
- 1799元咬死RTX 3060显卡 英特尔新驱动继续鸡血:性能猛增33%|当前快看
- 用上丰田氢燃料电池 海马7X-H来了:不到5分钟加注续航达800km-天天微速讯
- 汉字找茬王连歌曲不甘怎么过-世界热闻
- 石家庄太和网点电话_石家庄太和网
- 3个ChatGPT插件自动写书爆火!更多躺着赚钱玩法可以问AI自己_全球看热讯
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
.NET 文件上传服务设计 天天快播报
.NET文件上传服务设计
前言
在b站学习了一个后端小项目,然后发现这个文件上传设计还挺不错,来实现讲解一下。
(相关资料图)
项目结构如下:
基于策略+工厂模式实现文件上传服务
枚举
在Model层创建即可
public enum UploadMode { Local = 1, //本地上传 Qiniu = 2 //七牛云上传 }
第一步:创建文件策略和工厂
在Service层中创建FileStrategy文件夹,在该文件夹下分别创建Strategy
、QiNiuStrategy
、LocalStrategy
、FileFactory
、FileContext
类
Strategy 文件操作抽象类
/// /// 文件操作抽象类/// public abstract class Strategy{ public abstract Task Upload(List formFiles);}
LocalStrategy 本地策略
继承Strategy
文件操作抽象类并实现他里面的方法
后续要实现该方法
public class LocalStrategy:Strategy{ public override async Task Upload(List formFiles) { throw new NotImplementedException(); }}
QiNiuStrategy 七牛云策略
同上
public class QiNiuStrategy:Strategy{ public override async Task Upload(List formFiles) { throw new NotImplementedException(); }}
FileContext 上下文
在策略模式中通过上下文调用具体的策略
这里的好处就是我如果new LocalStrategy
则是本地上传服务,如果是new QiNiuStrategy
则是七牛云上传,详情看下方工厂的设计
/// /// 上下文,通过这个来调用具体的策略/// public class FileContext{ private Strategy _strategy; private List _formFiles; public FileContext(Strategy strategy, List formFiles) { _formFiles = formFiles; _strategy = strategy; } public async Task ContextInterface() { return await _strategy.Upload(_formFiles); }}
FileFactory 工厂
通过工厂去负责对象的实例化
枚举的作用就来了,更据枚举去判断实例化那一个对象
/// /// 工厂类,负责对象的实例化/// public class FileFactory{ public static Strategy CreateStrategy(UploadMode mode) { switch (mode) { case UploadMode.Qiniu: return new QiNiuStrategy(); case UploadMode.Local: return new LocalStrategy(); default: return new QiNiuStrategy(); } }}
第二步:对接服务层
在Interface接口层创建IFileService接口
这里需要安装Http
Nuget包,不然没有IFormFile
,我下的是Microsoft.AspNetCore.Http/2.2.2
public interface IFileService{ Task Upload(List files, UploadMode mode);}
在Service层创建FileService类实现上面的接口
public class FileService:IFileService{ public async Task Upload(List files, UploadMode mode) { FileContext fileContext = new FileContext(FileFactory.CreateStrategy(mode), files); return await fileContext.ContextInterface(); }}
上述通过上下文调用具体的策略,通过工厂去创建具体的类,工厂更据传入的枚举作为参数(构造函数传参),通过上下文的ContextInterface
就可以完成上传的逻辑了。
策略+工厂的好处就是,以后需要修改上传文件,只需要对策略进行更改和补充即可。意思就是新增一个上传策略,只需要创建一个策略类,然后去工厂类new一个就行了,不需要动Service层的东西。
本地上传功能实现
在本地策略类中实现上传方法
注意var filePath = $"{AppContext.BaseDirectory}/wwwroot";
是将文件保存在bin目录下的wwwroot目录了
public class LocalStrategy:Strategy{ public override async Task Upload(List formFiles) { var res = await Task.Run(() => { //存放多个文件路径 List result = new List(); foreach (var formFile in formFiles) { 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 = System.IO.File.Create(filePath + fileName)) { formFile.CopyTo(stream); } result.Add(fileName); } } return string.Join(",", result); }); return res; }}
七牛云上传功能实现
注册七牛云:https://www.qiniu.com/
从个人中心获取秘钥信息,安装SDK,编写上传逻辑
在Service层安装Qiniu
Nuget包
ak、sk为七牛云的秘钥,在个人中心查看
public class QiNiuStrategy : Strategy{ public override async Task Upload(List formFiles) { //先上传到本地,才能上传到七牛云,上传完成后本地的文件可删除 var res = await Task.Run(() => { Mac mac = new Mac("ak", "sk"); List result = new List(); foreach (var formFile in formFiles) { if (formFile.Length > 0) { var filePath_temp = $"{AppContext.BaseDirectory}/Images_temp"; var fileName = $"{DateTime.Now:yyyyMMddHHmmssffff}{formFile.FileName}"; if (!Directory.Exists(filePath_temp)) { Directory.CreateDirectory(filePath_temp); } using (var stream = System.IO.File.Create($"{filePath_temp}/{fileName}")) { formFile.CopyTo(stream); } // 上传文件名 string key = fileName; // 本地文件路径 string filePath = $"{filePath_temp}/{fileName}"; // 存储空间名 string Bucket = "pl-static"; // 设置上传策略 PutPolicy putPolicy = new PutPolicy(); // 设置要上传的目标空间 putPolicy.Scope = Bucket; // 上传策略的过期时间(单位:秒) //putPolicy.SetExpires(3600); // 文件上传完毕后,在多少天后自动被删除 //putPolicy.DeleteAfterDays = 1; // 生成上传token string token = Auth.CreateUploadToken(mac, putPolicy.ToJsonString()); Config config = new Config(); // 设置上传区域 config.Zone = Zone.ZONE_CN_East; // 设置 http 或者 https 上传 config.UseHttps = true; config.UseCdnDomains = true; config.ChunkSize = ChunkUnit.U512K; // 表单上传 FormUploader target = new FormUploader(config); HttpResult httpResult = target.UploadFile(filePath, key, token, null); result.Add(fileName); //删除备份文件夹 Directory.Delete(filePath_temp, true); } } return string.Join(",", result); }); return res; }}
Controller的实现
mode为1则会执行本地上传的逻辑代码,为2则会执行七牛云上传的服务代码。
[Route("api/[controller]/[action]")][ApiController]public class FileController : ControllerBase{ private readonly IFileService _fileService; public FileController(IFileService fileService) { _fileService = fileService; } /// /// 上传文件 /// /// 文件对象 /// 上传方式:本地或者七牛云 /// [HttpPost] public async Task UploadFile(List file, UploadMode mode) { return ResultHelper.Success(await _fileService.Upload(file, mode)); }}
测试
返回的图片路径可以根据自己的需求进行更改。
去bin目录查看图片是否上传成功
总结
上述内容就是对于文件上传服务的设计,有其他文件上传需求,比如分片断点上传、上传到其他的服务商,只需要新增策略,完成逻辑代码即可,还是很方便的一种文件上传设计。
关键词:
.NET 文件上传服务设计 天天快播报
变形积木:以装配式装修助力美团酒店布局“百品、千城、万店”-当前观点
国资委召开中央企业提高上市公司质量暨并购重组工作专题会-环球热资讯
科创板收盘播报:科创50指数跌0.14% 电气设备股表现强势|环球热议
马斯克邀请丰田加入特斯拉快充阵营:你们充电太慢了
要闻:新一轮油价调整将于6月28日开启 这次又有降价的可能
Steam客户端大规模更新!新增实用笔记功能 世界热议
AMD Yes!RX 6650 XT显卡杀到1799元:比N卡更香 天天播资讯
贾跃亭团队出身就是不一样!高合HiPhi Y内饰官图发布:平替FF 91
世界热文:手机微信出现状态是什么意思(微信出现状态是怎么回事)
云小课|RDS for MySQL参数模板一键导入导出,参数配置轻松搞定|焦点简讯
【环球时快讯】数据分析提效5倍,国有集团企业数字化历程 | 数字化标杆
ESMapV数字孪生三维可视化云平台-零代码可视化设计师助力者
flask自定义参数校验、序列化和反序列化_视讯
出庭当晚特朗普与“金主”举行晚宴,筹得200多万美元-世界微头条
微资讯!新华社权威快报|“一箭41星” 发射成功
欠2.4亿罚款又如何?贾跃亭国内“现身”:我不要烧太多钱也能快速成功 环球快讯
端午节放假3天自驾方便了!滴滴租车正式上线:跑车、房车全都有
全球即时:一机搞定全屋清洁!石头新品洗地机A10 Ultra今晚首销:到手价3399元
1799元咬死RTX 3060显卡 英特尔新驱动继续鸡血:性能猛增33%|当前快看
用上丰田氢燃料电池 海马7X-H来了:不到5分钟加注续航达800km-天天微速讯
汉字找茬王连歌曲不甘怎么过-世界热闻
全球热文:解析Spring内置作用域及其在实践中的应用
世界观点:pickle
RPG游戏开发日志: 世界观速讯
石家庄太和网点电话_石家庄太和网
3个ChatGPT插件自动写书爆火!更多躺着赚钱玩法可以问AI自己_全球看热讯
3.1级地震发生时上海居民躲床下避难 监控视频显示:剧烈摇晃、余震可能性不大|今头条
全球热点评!盘点C#最有价值的10个语法糖
Cannot Reference “XxxClass.xxx” Before Supertype Constructor Has Been Called
足球服批发_足球装备批发|热推荐
男子赶集买毛蛋到家全变鸭子 后续会饲养:网友点赞赚大了
直言理想ONE被问界M7打残 学习华为要看什么书:李想整理分享
丰田手把手教经销商诋毁纯电|每日动态
矛盾的马斯克!特斯拉4D雷达首拆:千元成本、探测距离300米
女学霸边读研边兼职3年赚17万:为了明确自己毕业后适合什么工作
开源即时通讯IM框架MobileIMSDK的H5端开发快速入门-世界关注
港股午评:恒指涨0.83% 恒生科技指数涨1.82% 天天看点
热点在线丨会定期删除 微软回应Edge私传图片问题:不含任何用户标识
天玑9200+加持 vivo X90s官宣:安卓最强悍的曲面屏旗舰
全球聚焦:李想最新发言引围观:我们谁都没兴趣搞、那点销量有啥可搞的
温州近视司机深夜高速上镜片突然脱落:两眼一抹黑
动态焦点:张雪峰称高考绝对是普通家庭改变命运的最好出路 回应建议报理科
2023年农业电商行业发展现状调查及行业未来趋势分析
用益-今日财经视点:美联储如期暂停加息但放鹰!
深度学习应用篇-元学习[15]:基于度量的元学习:SNAIL、RN、PN、MN
『题解』BZOJ2839 集合计数|天天热点评
热推荐:00-串口和SSH方式登录
戴德梁行亚洲REITs报告:C-REITs市场快速扩容 ESG将成为高质量发展新动力
因为读书值得
每日动态!六合一套装:八喜冰淇淋3.8元/杯抄底(商超8元)
巴黎治鼠患官宣失败:市民将与600万只老鼠共存
世界微速讯:全系降价3万后 蔚来ET5旅行版今日首发上市:这颜值30万你买吗?
每日热门:618最值得入手智能门锁非它莫属:华为智能门锁系列该怎么选?
业内第一!小鹏首宣开放北京城市智能辅助驾驶:不靠高精地图|天天热点
《长安三万里》曝角色海报 7月8日梦回诗意大唐 要闻
顶奢好文:3W字,穿透Spring事务原理、源码,至少读10遍|焦点速读
c++ mutex 每日消息
微头条丨月的暗面——戴冰选集_对于月的暗面——戴冰选集简单介绍
当前快报:大导演冯小刚多年的白癜风“消失”了引围观 这病真能治好?医生释疑
天天热资讯!高速错过出口 丰田亚洲龙缓行被大货车追尾致5死 官方:两司机均分心驾驶
全球聚焦:李想:理想MPV不会是埃尔法“私生子” 开上街比法拉利还瞩目
女子穿联名汉服进入迪士尼被拦 官方回应:网友吵翻 说好的穿衣自由呢
视讯!对象说冷怎么回
北斗GPS卫星授时服务器(NTP授时)应用于地铁自控系统
最新SMS-Activate短信验证码接收教程-观天下
陕西已累计收获小麦1213.63万亩占应收面积的八成以上
环球快资讯:女孩抓蛙一身泥巴被妈妈逮到 毫无畏惧:网友感慨这才是童年
热点评!《王者荣耀》诸葛亮新皮肤上线:最强大的仙尊 能御剑飞行
不花钱给电脑降温?有两种方法可行-全球聚焦
外卖起送价太高、凑单满减浪费?两部门发文
中国移动5G重大突破:无需安装APP 远程操控智能终端
这项重要工程动工,惠及众多荔湾街坊!|早安,荔湾-环球最资讯
ESP32物联网项目开发1-ESP32简介
美联储如市场预期“跳过”加息 2年期与10年期美债利差走阔 讯息
每日消息!雷军科普:金属背壳的手机曾经非常流行 为什么现在却很少有人用了?
曝驱逐舰07七月预售:搭载云辇-C 车长超比亚迪汉
苹果最强影像旗舰!iPhone 15 Pro Max相机曝光|环球即时
每隔俩烽火台设一个许愿栏又有何不可?
读发布!设计与部署稳定的分布式系统(第2版)笔记03_让系统稳定运行 每日精选
观热点:考古女生寄200斤洛阳铲装备吓坏父母 专业的标配
天天微动态丨用iPhone和用安卓的人 为什么谁也不服谁
快讯:药康生物(688046):6月14日北向资金增持1.11万股
焦点速讯:重新整理 .net core 实践篇——— 测试控制器[四十九]
云南一地多次发生巨响震动!官方回应:初判为浅源性地震-环球快资讯
天天观速讯丨英伟达太强 AMD最强显卡尚无客户采购:软件干不过CUDA
小米14设计定了:标准版小直屏 Pro版极窄微曲屏-环球热头条
快看点丨给全世界每个人发钱 OpenAI创始人这么飘了?
比尔·盖茨抵达北京:就健康和环境问题向中国取经|当前简讯
(上接第一版)
无敌时间_关于无敌时间介绍
创业板注册制IPO申请“开闸”满三年:千企竞逐上市梦 创业板加速构建创新资本中心
中央美术学院教授黄永玉去世 为具有重大影响力的艺术家
张柏芝发文呼吁大家关注糖尿病年轻化 减轻职场人群“高甜负担”
多地提前进入“烧烤模式” 新疆东部和南疆盆地有35℃以上高温
重金买下哈利波特老宅的屋主感到后悔 朝圣粉丝令其苦不堪言
歌手苏醒晒出自己和“球王”梅西的合影 兴奋之情溢于言表
腾讯音乐与原神达成深度战略合作 经典之声再度重逢
2023年“惠购湖北”家电消费券即将发放 总计投入财政资金3亿元
Set 接口及其常用方法