微前端架构如何改变企业的开发模式与效率提升
553
2022-10-22
基于SqlSugar的开发框架循序渐进介绍(7)-- 在文件上传模块中采用选项模式【Options】处理常规上传和FTP文件上传
在基于SqlSugar的开发框架的服务层中处理文件上传的时候,我们一般有两种处理方式,一种是常规的把文件存储在本地文件系统中,一种是通过FTP方式存储到指定的FTP服务器上。这种处理应该由程序进行配置,决定使用那种方式,那么这里面我们为了弹性化处理, 在文件上传模块中采用选项模式【Options】处理常规上传和FTP文件上传的配置参数信息。
微软引入选项模式,它是用于配置框架服务使用的设置. 选项模式由Microsoft.Extensions.OptionsNuGet包实现,除了ASP.NET Core应用,它还适用于任何类型的应用程序,如果需要了解,微软的文档详细解释了选项模式。
选项模式的限制之一是你只能解析(注入) IOptions
1、文件上传处理
在前面我们介绍过,文件上传处理的逻辑中有两部分,一个是本地文件处理,一个是FTP文件处理,它们选择那种方式,依赖于配置参数的信息,如下示意图所示。
在本地文件处理过程中,如果是Web API方式调用服务层,那么就在Web API所在的文件系统中,如果是Winform界面直接调用服务层,那么就是在当前系统中处理文件,这种方式可以有效的管理我们的文件信息。
在FTP文件处理过程中,则是根据选项参数的信息,调用FluentFTP类库进行文件的上传操作。
在Winform界面中上传文件的界面如下所示,它对于采用哪种方式是不知道的,具体由配置参数决定。
而所有的附件信息我们存储在数据库里面,文件则存放在对应的文件夹里面,可以统一进行管理查看和管理。
2、选项模式【Options】的处理
首先根据我们的处理方式,我们定义一个对象,用于承载上传参数的信息,如下代码所示。
///
然后在项目中添加Microsoft.Extensions.Options引用。
我们定义文件上传服务类的和它的构造函数,以便于选项模式的处理。
///
我们看到这里提供了一个注入接口的参数信息,这样完成参数的注入加载后,我们在该服务类调用的时候,就可以使用它的选项参数信息了。
例如我们在其中通用的上传处理方法上如下所示。
///
我们来通过读取选项参数的信息,来决定采用哪种上传文件的方式。
我们在基于- framewrok的Winform项目App.config中指定下面的配置信息
就这样,在- framework的WInform项目启动的时候,我们就完成了文件上传选项参数的读取加载,这样在 FileUploadService 里面的构造函数,就可以获得对应的选项参数信息对象了。 对于-core的程序,我们知道它的配置信息是appSettings.json,如下节点所示。 "UploadSettingOptions": { "AttachmentBasePath": "", //可指定的存储物理地址,如C:\\Attachment,如果没有配置则默认相对目录。 "AttachmentUploadType": "", //ftp或空,为空则为普通方式 "FtpServer": "114.215.106.96", //FTP服务器地址 "FtpUser": "web2", //FTP账号 "FtpPassword": "", //FTP密码 "FtpBaseUrl": "API的初始化选项对象信息,具体加载的代码如下所示。 builder.Services.Configure 相对- framework的处理来说,使用扩展函数来简化了不少。 这样,我们在文件上传处理的服务类中就可以顺利获得对应的配置信息了。 /// 我们在使用FTP上传文件的时候,使用了FluentFtp类库实现FTP文件的上传处理的,构建FTP对象的处理代码如下所示。 //使用FluentFTP操作FTP文件var client = new FtpClient(this._options.FtpServer, this._options.FtpUser, this._options.FtpPassword);//如果配置指定了端口,则使用特定端口if (!string.IsNullOrEmpty(this._options.FtpServer) && this._options.FtpServer.Contains(":")){ string port = this._options.FtpServer.Split(':')[1]; if (!string.IsNullOrEmpty(port)) { client.Port = port.ToInt32(); }} 上传FTP文件的代码如下所示。 //确定日期时间目录(格式:yyyy-MM),不存在则创建 string savePath = string.Format("/{0}-{1:D2}/{2}", DateTime.Now.Year, DateTime.Now.Month, category); bool isExistDir = client.DirectoryExists(savePath); if (!isExistDir) { client.CreateDirectory(savePath); } //使用FTP上传文件 //避免文件重复,使用GUID命名 var ext = FileUtil.GetExtension(info.FileName); var newFileName = string.Format("{0}{1}", Guid.NewGuid().ToString(), ext);//FileUtil.GetFileName(file); savePath = savePath.UriCombine(newFileName); var uploaded = await client.UploadAsync(info.FileData, savePath, FtpRemoteExists.Overwrite, true); //成功后,写入数据库 if (uploaded == FtpStatus.Success) { 通过选项参数的方式,我们可以配置参数的IOC处理话,从而实现了参数的灵活配置和读取操作。 在其他业务处理的服务类中,如果涉及到一些需要配置的信息,我们都可以利用这种模式实现参数内容的配置处理。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~