.NET 文件上传服务设计

这篇具有很好参考价值的文章主要介绍了.NET 文件上传服务设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

.NET文件上传服务设计

前言

在b站学习了一个后端小项目,然后发现这个文件上传设计还挺不错,来实现讲解一下。

项目结构如下:

.NET 文件上传服务设计

基于策略+工厂模式实现文件上传服务

枚举

在Model层创建即可

    public enum UploadMode
    {
        Local = 1, //本地上传
        Qiniu = 2 //七牛云上传
    }

第一步:创建文件策略和工厂

在Service层中创建FileStrategy文件夹,在该文件夹下分别创建StrategyQiNiuStrategyLocalStrategyFileFactoryFileContext

Strategy 文件操作抽象类

/// <summary>
/// 文件操作抽象类
/// </summary>
public abstract class Strategy
{
    public abstract Task<string> Upload(List<IFormFile> formFiles);
}

LocalStrategy 本地策略

继承Strategy 文件操作抽象类并实现他里面的方法

后续要实现该方法

public class LocalStrategy:Strategy
{
    public override async Task<string> Upload(List<IFormFile> formFiles)
    {
        throw new NotImplementedException();
    }
}

QiNiuStrategy 七牛云策略

同上

public class QiNiuStrategy:Strategy
{
    public override async Task<string> Upload(List<IFormFile> formFiles)
    {
        throw new NotImplementedException();
    }
}

FileContext 上下文

在策略模式中通过上下文调用具体的策略

这里的好处就是我如果new LocalStrategy则是本地上传服务,如果是new QiNiuStrategy则是七牛云上传,详情看下方工厂的设计

/// <summary>
/// 上下文,通过这个来调用具体的策略
/// </summary>
public class FileContext
{
    private Strategy _strategy;
    private List<IFormFile> _formFiles;

    public FileContext(Strategy strategy, List<IFormFile> formFiles)
    {
        _formFiles = formFiles;
        _strategy = strategy;
    }

    public async Task<string> ContextInterface()
    {
        return await _strategy.Upload(_formFiles);
    }
}

FileFactory 工厂

通过工厂去负责对象的实例化

枚举的作用就来了,更据枚举去判断实例化那一个对象

/// <summary>
/// 工厂类,负责对象的实例化
/// </summary>
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接口

这里需要安装HttpNuget包,不然没有IFormFile,我下的是Microsoft.AspNetCore.Http/2.2.2

public interface IFileService
{
    Task<string> Upload(List<IFormFile> files, UploadMode mode);
}

在Service层创建FileService类实现上面的接口

public class FileService:IFileService
{
    public async Task<string> Upload(List<IFormFile> 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<string> Upload(List<IFormFile> formFiles)
    {
        var res = await Task.Run(() =>
        {
            //存放多个文件路径
            List<string> result = new List<string>();
            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层安装QiniuNuget包

ak、sk为七牛云的秘钥,在个人中心查看

public class QiNiuStrategy : Strategy
{
    public override async Task<string> Upload(List<IFormFile> formFiles)
    {
        //先上传到本地,才能上传到七牛云,上传完成后本地的文件可删除
        var res = await Task.Run(() =>
        {
            Mac mac = new Mac("ak", "sk");
            List<string> result = new List<string>();
            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;
    }
    /// <summary>
    /// 上传文件
    /// </summary>
    /// <param name="file">文件对象</param>
    /// <param name="mode">上传方式:本地或者七牛云</param>
    /// <returns></returns>
    [HttpPost]
    public async Task<ApiResult> UploadFile(List<IFormFile> file, UploadMode mode)
    {
        return ResultHelper.Success(await _fileService.Upload(file, mode));
    }
}

测试

.NET 文件上传服务设计

.NET 文件上传服务设计

返回的图片路径可以根据自己的需求进行更改。

去bin目录查看图片是否上传成功

.NET 文件上传服务设计

总结

上述内容就是对于文件上传服务的设计,有其他文件上传需求,比如分片断点上传、上传到其他的服务商,只需要新增策略,完成逻辑代码即可,还是很方便的一种文件上传设计。文章来源地址https://www.toymoban.com/news/detail-485240.html

到了这里,关于.NET 文件上传服务设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • .NET Core WebAPI 基础 文件上传

    .NET Core WebAPI 基础 文件上传

    昨天分享了一个在WebApi中如何接收参数的文章 传送门,然后有新人小伙伴就问了,那文件上传呢,这个怎么弄,借此我写了一个小demo,分享给大家。 通常来说,上传文件,我们是使用POST,还是老规矩先上代码: 这是需要上传的txt文件。 这里有一个需要注意的地方,就是上

    2024年02月11日
    浏览(10)
  • ASP.NET Core MVC 从入门到精通之文件上传

    ASP.NET Core MVC 从入门到精通之文件上传

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步

    2024年02月03日
    浏览(12)
  • Go语言使用net/http实现简单登录验证和文件上传功能

    Go语言使用net/http实现简单登录验证和文件上传功能

         最近再看Go语言web编程,go语言搭建Web服务器,既可以用go原生的net/http包,也可以用gin/fasthttp/fiber等这些Web框架。本博客使用net/http模块编写了一个简单的登录验证和文件上传的功能,在此做个简单记录。 目录 1.文件目录结构 2.编译运行 3.用户登录  4.文件上传 5.mime/m

    2024年02月11日
    浏览(14)
  • .net6Api后台+VUE3前端实现上传和下载文件全过程

    .net6Api后台+VUE3前端实现上传和下载文件全过程

    首先本文参考的是,感谢博主: net6WebApi上传下载文件_cduoa的博客-CSDN博客_webapi下载文件 在博主的基础上,增加了新的功能,代码中有注明,并且使用VUE3前端实现。 后端部分: 1.首先建立IFileService文件 2.建立FileService文件 3.增加FileController文件 4.Program文件中,进行配置和跨域

    2023年04月09日
    浏览(18)
  • SpringCloud简单文件上传微服务采取curl或者页面点击实现文件上传

    SpringCloud简单文件上传微服务采取curl或者页面点击实现文件上传 一、大致介绍 1、本章节主要搭建了一个简单的页面上传Web控制器,主要为后序工作加入 zuul 微服务而做的准备; 2、不过在本章节用命令上传文件的时候,在windows命令窗口有时候会出现中文乱码什么的,请注意

    2024年02月10日
    浏览(10)
  • SpringBoot上传文件到Minio服务器,支持批量上传

    SpringBoot上传文件到Minio服务器,支持批量上传

    本文主要介绍如何使用SpringBoot上传到minio服务器。 没什么可多说的,公司用什么咱们开发研究什么就完事了。直接分享核心代码。 minio依赖 配置文件 首先是核心的参数,包括服务器minio地址,以及用户名密码,使用的桶名称 controller代码 如果只需要上传文件,只需要Multipa

    2024年02月08日
    浏览(10)
  • 若依微服务上传图片文件代理配置

    若依微服务上传图片文件代理配置

    在使用若依微服务文件上传时候,文件上传成功会上传到D:/ruoyi/uploadPath目录下。默认使用9300端口进行访问图片文件,现在我想把它代理到80端口应该怎么做呢? 配置前:http://localhost:9300/statics/2023/09/24/test.jpg 配置后:http://localhost/statics/2023/09/24/test.jpg 在前端目录中.env.develo

    2024年02月02日
    浏览(9)
  • Spring MVC异步上传、跨服务器上传和文件下载

    Spring MVC异步上传、跨服务器上传和文件下载

    之前的上传方案,在上传成功后都会跳转页面。而在实际开发中,很多情况下上传后不进行跳转,而是进行页面的局部刷新,比如:上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。 编写JSP页面,引入jQuery和jQuery表单上传工具jquery.form.js【该js文件已经

    2024年02月16日
    浏览(15)
  • JAVA实现文件上传到服务器

    JAVA实现文件上传到服务器

    java如何实现大文件断点续传、秒传,JAVA实现文件上传到服务器,jsp实现文件上传到服务器,SpringBoot实现文件上传到服务器,SpringMVC实现文件上传到服务器,SpringCloud实现文件上传到服务器,webuploader实现文件上传到服务器,百度webuploader实现文件上传到服务器,JAVA如何将文件

    2024年04月27日
    浏览(18)
  • 上传本地文件到HDFS服务器

    在这篇文章中,我将详细介绍如何将本地文件上传到HDFS(分布式文件系统)服务器。我们将使用Hadoop命令行工具来完成这个任务。 首先,确保你已经安装了Hadoop并且HDFS服务器正在运行。接下来,我们将按照以下步骤进行操作: 步骤 1: 检查HDFS文件系统 在上传文件之前,我们

    2024年02月04日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包