Skip to content
.NET 开发者指北.NET 开发者指北
CMS
.NET指北
FreeKit
Docker
关于
博客
github icon
    • 文件上传系统
      • 本地文件上传
        • 七牛云文件上传
          • 其他特性
            • 文件上传其他配置项
            • 行为日志
              • 基于 RBAC 实现权限设计
                • 方法级别的权限控制(API级别)
                  • LinCms.Scaffolding 代码生成器
                    • Autofac 依赖注入小知识
                      • ASP.NETCore 下 FreeSql 的仓储事务

                      文件上传系统

                      calendar icon2020年5月13日timer icon大约 4 分钟word icon约 1259 字

                      此页内容
                      • 本地文件上传
                      • 七牛云文件上传
                      • 其他特性
                      • 文件上传其他配置项

                      # 文件上传系统

                      lin-cms-dotnetcore 默认集成了文件上传功能,并可自由切换存储位置,前端也有相应的组件匹配使用.

                      目前后端实现了七牛云文件(QiniuService)上传,本地文件(LocalFileService)上传。

                      接口 IFileService

                      public interface IFileService
                      {
                          /// <summary>
                          /// 单文件上传,键为file
                          /// </summary>
                          /// <param name="file"></param>
                          /// <param name="key"></param>
                          /// <returns></returns>
                          Task<FileDto> UploadAsync(IFormFile file, int key = 0);
                      }
                      
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10

                      配置项 appsettings.json

                      # 本地文件上传

                      • PrefixPath:默认为wwwroot下的文件目录配置项,assets,多级目录,前后不要加**/**,如assets/file
                      • Host: 文件上传后,访问域名配置,这里配置https://localhost:5001/open in new window
                      • ServiceName :配置当前系统上传时使用哪个实现,可选配置项(LocalFileService、QiniuService)
                        • 当为LocalFileService时,文件保存路径为wwwroot静态文件目录下,上传至本地,
                        • QiniuService 上传至七牛云

                      实际文件路径

                      /assets/2020/5/8/xxxxxx-1111-12-12-12--1-21.png

                      参数化

                      /{STORE_DIR}/{year}/{month}/{day}/{guid}.文件后缀

                        "FileStorage": {
                          "ServiceName": "LocalFileService",//LocalFileService、QiniuService
                          "LocalFile":{
                            "PrefixPath": "assets",
                            "Host": "https://localhost:5001/"
                          }
                        },
                      
                      1
                      2
                      3
                      4
                      5
                      6
                      7

                      # 七牛云文件上传

                      SERVICE为QiniuService时,系统将需要使用如下配置项,

                      • AK :七牛云密钥AccessKey
                      • SK :七牛云密钥SecretKey
                      • Bucket :七牛云新建存储空间的名称(唯一值)
                      • PrefixPath 文件根目录前缀
                      • Host:七牛云配置的CDN 加速域名,可使用临时分配的域名,仅一个月有效期,绑定自己的域名,可配置泛子域名
                      • UseHttps:使用https,这个参数好像没啥用。

                      上传文件名

                      assets/20191218150043868887.jpg

                      参数

                      {PrefixPath}/{yyyyMMddHHmmssffffff}.文件后缀

                        "FileStorage": {
                         "ServiceName": "QiniuService",
                          "Qiniu": {
                            "AK": "",
                            "SK": "",
                            "Bucket": "vvv",
                            "PrefixPath": "assets",
                            "Host": "http://images.igeekfan.cn/",
                            "UseHttps": false
                          }
                        },
                      
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10
                      11

                      lin-cms 默认对外暴露了cms/file/作为文件上传接口,通过该接口可以直接使用 HTTP post 方法上传文件。

                      运行项目后,我们可以看到swagger,找到cms/file https://localhost:5001/swagger/index.htmlopen in new window

                      请求方式路径功能
                      HttpPost/cms/file/upload单文件上传

                      直接可通过swagger选择文件后,输入key为0,执行Execute

                      {
                        "key": "file_0",
                        "path": "assets/2020/05/08/64263e57-9a24-4933-9116-25616c801e93.png",
                        "url": "https://localhost:5001/assets/2020/05/08/64263e57-9a24-4933-9116-25616c801e93.png",
                        "id": 19
                      }
                      
                      1
                      2
                      3
                      4
                      5
                      6
                      请求方式路径功能
                      HttpPost/cms/file多文件上传

                      由于swagger-ui的规范,目前多文件无法正确显示,即时正常显示出选择多文件,后台却得不到请求的数据。。

                      我们通过postman上传多文件。

                      open in new window

                      由于上传了两个文件,因此我们得到了两个元素的数组,它们的结构如下:

                      [
                          {
                              "key": "file_0",
                              "path": "assets/20200512234540511428.png",
                              "url": "http://images.igeekfan.cn/assets/20200512234540511428.png",
                              "id": 38
                          },
                          {
                              "key": "file_1",
                              "path": "assets/20200512234540321269.jpg",
                              "url": "http://images.igeekfan.cn/assets/20200512234540321269.jpg",
                              "id": 37
                          }
                      ]
                      
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10
                      11
                      12
                      13
                      14
                      name说明类型
                      key文件上传的keystring
                      id文件存储到数据库的idstring
                      path文件存储的路径pathstring
                      url可访问的 urlstring

                      TIP 系统会自动帮助我们上传的文件做md5,因此你大可不必担心文件重复上传,如果你上传了 重复的文件,服务器会返回已传文件的数据。

                      # 其他特性

                      Kestrel是内置的ASP.NET Core的内置WEB服务器,是一个中间件,支持跨平台

                      1.运行示意:Internet---(通过HTTP访问)--->Kestrel(Kestrel WEB Server Port 5001)--内部HttpContext通过--->>访问到ApplicationCode

                      1. 在Internet到Kesterl中间加一个反向代理(nginx,iis,apache)

                      第一种方式,文件大小的配置与Kestrel有关。也和应用代码有关。

                      Kestrel默认的最大请求正文大小为 30,000,000 个字节,约为 28.6 MB.

                      在Program.cs中配置Kestrel的文件大小

                      webBuilder.ConfigureKestrel((context, options) =>
                      {
                          //设置应用服务器Kestrel请求体最大为8MB
                          
                          options.Limits.MaxRequestBodySize = 1024*1024*8;
                      });
                      
                      1
                      2
                      3
                      4
                      5
                      6

                      或者在StartUp中配置应用程序级别的设置

                      services.Configure<FormOptions>(options =>
                      {
                          //单个文件上传的大小限制为8 MB      默认134217728 应该是128MB
                          options.MultipartBodyLengthLimit = 1024 * 1024 * 8;     //8MB
                      });
                      
                      1
                      2
                      3
                      4
                      5

                      如果部署在反向代理后,还与代理服务器有关。

                      # 文件上传其他配置项

                      • MaxFileSize:上传文件总大小,1024*1024*80=83886080=80MB
                      • NumLimit:上传文件总数量
                      • Include,允许某些类型文件上传,文件格式以,隔开
                      • Exclude:禁止某些类型文件上传,文件格式以,隔开
                      "FileStorage": {
                          "MaxFileSize": 83886080,
                          "NumLimit": 3,
                          "Include": "",
                          "Exclude": ".exe,.dll",
                      }
                      
                      1
                      2
                      3
                      4
                      5
                      6

                      exclude和include这两项配置,默认情况下,这两者只会有一 项生效;若这二者中有一项为空,则另一项不为空的配置会生效;如果两项皆为空的话,会 通过所有文件类型;如果二者都不为空,则include为有效配置,而exclude会失效;总 而言之,系统只会支持使用一项,二者都为为空的情况下,则通过所有文件类型。

                      完整配置项

                       "FileStorage": {
                          "MaxFileSize": 83886080,
                          "NumLimit": 3,
                          "Include": ".png,.jpg",
                          "Exclude": ".exe,.dll",
                          "ServiceName": "LocalFileService",//LocalFileService、QiniuService
                          "LocalFile":{
                            "PrefixPath": "assets",
                            "Host": "https://localhost:5001/"
                          },
                          "Qiniu": {
                            "AK": "eUH1O-ft66S4XM2GIK7FGmj7czuYkcAyNGDAc-wq",
                            "SK": "4dOi1daSr2-YgofhAfWb8JaLrbgozCmgD6AUmmM9",
                            "Bucket": "vvv",
                            "PrefixPath": "assets",
                            "Host": "http://images.igeekfan.cn/",
                            "UseHttps": false
                          }
                        },
                      
                      1
                      2
                      3
                      4
                      5
                      6
                      7
                      8
                      9
                      10
                      11
                      12
                      13
                      14
                      15
                      16
                      17
                      18
                      19
                      • 官网 https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1open in new window
                      edit icon在 GitHub 上编辑此页open in new window
                      上次编辑于: 2022/9/13 11:34:29
                      贡献者: luoyunchong,igeekfan
                      下一页
                      行为日志
                      MIT Licensed | Copyright © 2021-present luoyunchong
                      苏ICP备16046457号-1

                      该应用可以安装在你的 PC 或移动设备上。这将使该 Web 应用程序外观和行为与其他应用程序相同。它将在出现在应用程序列表中,并可以固定到主屏幕,开始菜单或任务栏。此 Web 应用程序还将能够与其他应用程序和你的操作系统安全地进行交互。

                      详情