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

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

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

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

刚开始的时候,我使用第一种方式,效果不怎么好,就着手第二中方式的实现,第二中方式首先要解决的是验证的问题,还好现在有 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 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 53 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 437 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 2 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    7932 引用 • 36284 回帖 • 169 关注
  • abitmean

    有点意思就行了

    30 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 541 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 3 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 383 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 911 回帖 • 237 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 606 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 3 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 337 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    190 引用 • 1057 回帖 • 1 关注
  • danl
    128 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 461 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 533 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 53 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 1 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 465 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖 • 2 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖