使用 netcore 实现统一文件上传服务

本贴最后更新于 2001 天前,其中的信息可能已经物是人非

一般来讲,每个系统都有上传图片或者文件的功能,多个项目的上传文件这个功能基本上也都是差不多的,无非是限制上传的文件类型不一样,所有我们有必要开发一个统一的服务来满足公司 不同项目的上传文件的需求。

要满足不同项目的上传功能,大概有两种方法。第一种,各自项目前端还是要上传到对应的后端,后端统一上传到文件服务,这样的好处是可以利用各个项目的验证功能,缺点是项目后端还是有少许逻辑,而且从项目前端到对应后端,再从项目后端到上传服务,数据的传输多了一步。第二种,从各个项目的前端直接上传的上传服务,这种方式效率高,对应的后端也没什么逻辑,但是需要解决权限验证的问题,不然别人知道了你的上传服务地址,偷偷上传就不好了。

刚开始的时候,我使用第一种方式,效果不怎么好,就着手第二中方式的实现,第二中方式首先要解决的是验证的问题,还好现在有 api 验证的方式可以直接借鉴,所以我决定使用 jwt 来做权限验证。具体流程是这样的:项目前端调用本项目 api 获取 jwt,项目前端携带 jwt 直接把文件上传到上传服务,上传服务返回上传成功的 url 地址。 上传服务和项目后端都属于项目后端部分,这样就确保了 jwt 的加密是外人不可见的,思路我们想清楚了,现在就要开始细节的设计了。

首先是上传服务这边的功能配置,结合 appsettings.json,我们逐个说一下:

{
  "AllowedHosts": "*",
  "urls": "http://localhost:6001",
  "uploadServer": {
    "rootUrl": "http://localhost:6001",
    "entryPoint1": "/upload",
    "entryPoint2": "/chunkUpload",
    "virtualPath": "",
    "physicalPath": "/Users/loogn/Desktop/uploader",
    "appendMimes": ".htm3:text/html;",
    "responseCache": 604800,
    "jwtSecret": "1234561234",
    "limitSize": "20mb",
    "allowExts": ".txt;.jpg;.jpeg;.png;.doc;.docx;.xls;.xlsx;.ppt;.pptx;.pdf",
    "apps": {
      "default": {
        "allowOrigins": "",
        "enableThumbnail": true,
        "limitExts": ".exe;",
        "thumbnailExts": ".jpg;.jpeg;.png;"
      },
      "app1": {
        "allowOrigins": "*"
      }
    }
  }
}
  • rootUrl 是上传成功后文件 url 的基地址,如果作为静态文件服务器来提供对上传成功的文件的访问,那么这这里的地址应该和 urls 一样;如果上传成功的文件的访问由其他服务器提供(如 nginx),那么这里就是对应 nginx 的域名;
  • entryPoint1 是一般上传的服务地址,完整地址是 urls+entryPoint1;
  • entryPoint2 是分块上传的服务地址,完整地址是 urls+entryPoint2,分块上传需要 html5 的支持,对应的客户端类库是开源项目 simple-uploader ;
  • virtualPath:作为静态文件服务器的时候,对应的项目目录;
  • physicalPath:文件上传的本地目录;
  • appendMimes: 作为静态文件服务器时,添加的 mime 类型映射;
  • responseCache:作为静态文件服务器时,静态文件的缓存时间(秒);
  • jwtSecret:jwt 的秘钥,各个项目后端要使用相同的秘钥加密获得 jwt;
  • limitSize:默认限制大小,只能以 mb 或 kb 为单位结尾;
  • allowExts : 默认允许上传的文件类型后缀
  • apps: 该节点中是一个字典结构,key 是各个项目名称,value 是特定项目的特殊配置,其中 key 为 default 的所有项目的默认配置。

我们稍后再说 value 中的配置项,现在我们说一下 jwt。jwt 需要通过 header 或者 form 传给上传服务。
对 jwt 不清楚的同学可以看这里 jwt.io ,我们约定 payload 中有以下四项配置:

  1. exp 表示过期时间,utc 时间戳,必填
  2. app 表示项目名称,必填
  3. size 表示项目上传大小限制 ,支持 mb 和 kb 为单位,选填,可以覆盖 uploadServer.limitSize
  4. exts 表示该项目额外支持的文件类型,选填

由于 jwt 是项目后端发布的,所以项目后端有权限和义务做好相应的配置,比如 exp 过期时间,由于 jwt 发布出去之后无法收回,exp 就显得额外重要了,如果上传小文件,估计 1 分钟的时间就够了(前提是项目后端的时间和上传服务的时间一致),比如 exts 配置,如果该项目需要上传 mp4 文件,那么并不需要再上传服务器上修改配置,只需要再返回 jwt 的时候加入 exts:".mp4"就行了。

现在再说说上传服务的配置中 apps 子节点的配置:

  1. allowOrigins 允许上传的前台域名
  2. enableThumbnail 作文静态文件服务器时,是否启用生成缩率图功能
  3. limitExts 禁止的文件后缀,比如".exe",如果默认配置或 jwt 配置允许,这里是最后防线,所以项目可上传的后缀为 uploadServer.allowExts+jwt 中 exts-apps 中 limitExts
  4. thumbnailExts 启用缩率图时,可以应用的文件后缀,缩率图地址使用返回的 url 加?w=100&h=200 这样的地址访问。

项目地址:uploadServer

  • .NET
    27 引用 • 6 回帖 • 5 关注
  • 上传
    22 引用 • 157 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 161 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 1 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 16 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖 • 1 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 319 关注
  • 音乐

    你听到信仰的声音了么?

    61 引用 • 511 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 672 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    313 引用 • 547 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 281 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 559 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 14 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖 • 1 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖 • 2 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 1 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    135 引用 • 190 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 3 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 370 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 76 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 6 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    288 引用 • 4485 回帖 • 664 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 584 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 4 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 535 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 101 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注