WebAPi实现多文件上传,并附带参数

news2025/2/3 16:16:28

需要实现的效果为,通过WebApi实现多文件上传功能,并且在上传时需要能附带文件说明参数,用于保存文件记录

–这里是需要的文件说明参数类

   /// <summary>
    /// 前端文件上传时参数数据
    /// </summary>
    public class DistributionData
    {
        /// <summary>
        /// 工位编码
        /// </summary>
        public string StationCodes { get; set; }
        /// <summary>
        /// 产品编码
        /// </summary>
        public string MaterialCodes { get; set; }
        /// <summary>
        /// 文件ID
        /// </summary>
        public string NetworkFileId { get; set; }
        /// <summary>
        /// 文件类型
        /// </summary>
        public string FileType { get; set; }
        /// <summary>
        /// 类型Id
        /// </summary>
        public int TypeId { get; set; }
        /// <summary>
        /// 类型名称
        /// </summary>
        public string TypeName { get; set; }
        /// <summary>
        /// 来源Id
        /// </summary>
        public string SourceId { get; set; }
        /// <summary>
        /// 类型说明,补充文件类型
        /// </summary>
        public string TypeDescribe { get; set; }
        /// <summary>
        /// 上传人
        /// </summary>
        public string UserAccount { get; set; }
        /// <summary>
        /// 上传人
        /// </summary>
        public string UserName { get; set; }
        /// <summary>
        /// 上传文件夹名称
        /// </summary>
        public string DirectoryName { get; set; }
    }

Api上传方法写好之后直接ApiPost调用结果如下
在这里插入图片描述
调用失败后,通过参考https://www.cnblogs.com/kingCpp/p/4901268.html文章发现需要实现此效果可以通过添加【MultipartDataMediaFormatter】Nuget包
在这里插入图片描述

并在添加好程序包之后需要对Api进行配置

  public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            #region 为了实现文件上传的同时带参数,配置MultipartDataMediaFormatter
            GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
            GlobalConfiguration.Configuration.Formatters.Add(new MultipartDataMediaFormatter.FormMultipartEncodedMediaTypeFormatter());
            #endregion
            // Web API 路由
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

配置好之后再次调用接口发现参数已经可以拿到了
在这里插入图片描述
接下来就是获取文件了,文件我们可以直接在具体的上传方法中通过System.Web.HttpContext.Current.Request.Files获取,在这里为了更加直观的看到效果,将获取文件封装为一个方法,然后通过调用此方法获取上传的文件,并放到实体参数中

  /// <summary>
        /// 获取文件上传集合
        /// </summary>
        /// <returns></returns>
        public static List<System.Web.HttpPostedFile> GetFileList()
        {
            if (System.Web.HttpContext.Current.Request.Files.Count == 0)
            {
                return null;
            }
            List<System.Web.HttpPostedFile> res = new List<System.Web.HttpPostedFile>();
            for (int i = 0; i < System.Web.HttpContext.Current.Request.Files.Count; i++)
            {
                res.Add(System.Web.HttpContext.Current.Request.Files[i]);
            }
            return res;
        }

在这里插入图片描述
这样参数与文件就都获取到了,再就是具体上传与保存记录了
这里是我接口的返回格式,一起贴出来,以免忘记

  /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="disData"></param>
        /// <returns></returns>
        public async Task<BaseModuleResult> UploadFile(DistributionData disData, List<System.Web.HttpPostedFile> Files)
        {
            BaseModuleResult result = new BaseModuleResult();
            //Thread.Sleep(1000);
            List<Entity.Base_NetworkFile> list = new List<Entity.Base_NetworkFile>();
            ///文件上传地址
            var UploadFileUrl = ConfigHelper.AppSettings("staticfilesLocal");
            int IsOk = 0;
            if (Files.Count > 0)
            {
                IDatabase db = DataFactory.Database();
                DbTransaction transaction = db.BeginTrans();
                for (int i = 0; i < Files.Count; i++)
                {
                    var files = Files[i];
                    string FileEextension = System.IO.Path.GetExtension(files.FileName);
                    //获取文件类型、文件图标
                    this.DocumentType(FileEextension, out string FileType, out string Icon);
                    #region 文件上传地址
                    string fullFileName = string.Empty;
                    if (!string.IsNullOrWhiteSpace(disData.DirectoryName))
                    {
                        fullFileName = $"{UploadFileUrl}/{disData.DirectoryName}/{DateTime.Now.ToString("yyyyMMdd")}/{CommonHelper.GetGuid}{FileEextension}";
                    }
                    else
                    {
                        fullFileName = $"{UploadFileUrl}/{DateTime.Now.ToString("yyyyMMdd")}/{CommonHelper.GetGuid}{FileEextension}";
                    }
                    #endregion

                    #region 文件夹目录处理
                    string path = System.IO.Path.GetDirectoryName(fullFileName);
                    if (!System.IO.Directory.Exists(path))
                    {
                        System.IO.Directory.CreateDirectory(path);
                    }
                    #endregion

                    #region 开始上传
                    if (!System.IO.File.Exists(fullFileName))
                    {
                        byte[] byteImage = new byte[files.InputStream.Length];
                        files.InputStream.Read(byteImage, 0, byteImage.Length);
                        files.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
                        try
                        {
                            Entity.Base_NetworkFile entity = new Entity.Base_NetworkFile();
                            //保存文件记录表相关数据
                            Save_NetworkFile(disData, files.FileName, files.ContentLength.ToString(), FileEextension, Icon, FileType, fullFileName, UploadFileUrl, db, transaction, ref IsOk, ref entity);
                            if (IsOk > 0)
                            {
                                list.Add(entity);
                                files.SaveAs($"{fullFileName}");
                            }
                        }
                        catch (Exception ex)
                        {
                            IsOk = 0;
                            db.Rollback();
                            System.IO.File.Delete(fullFileName);
                            result.info = ex.Message;
                            return result;
                        }
                    }
                    #endregion
                }
                #region 组装返回数据
                //文件记录不为空并且=文件数,已确认所有文件上传成功
                if (list != null && list.Any() && list.Count == Files.Count)
                {
                    result.code = System.Net.HttpStatusCode.OK;
                    result.info = "已上传成功";
                    object[] successArr = new object[list.Count];
                    for (int i = 0; i < list.Count; i++)
                    {
                        successArr[i] = new
                        {
                            FileName = list[i].FileName,
                            FilePath = list[i].FilePath,
                            //这里是拼接一个网络路径的方法
                             NewWorkPath = UploadHelper.HttpRelativePathToNetWorkURL(list[i].FilePath),
                            NewWorkFileID = list[i].NetworkFileId,//文件记录Id
                        };
                    }
                    db.Commit();
                    result.data = successArr;
                }
                else
                {
                    db.Rollback();
                    result.code = System.Net.HttpStatusCode.BadRequest;
                    result.info = "上传失败";
                }
                #endregion
            }
            return result;
        }
      /// <summary>
        /// 获取文件类型、文件图标
        /// </summary>
        /// <param name="Eextension">后缀名</param>
        /// <param name="FileType">要返回文件类型</param>
        /// <param name="Icon">要返回文件图标</param>
        private void DocumentType(string Eextension, out string FileType, out string Icon)
        {
            string _FileType = "";
            string _Icon = "";
            switch (Eextension)
            {
                case ".docx":
                    _FileType = "word";
                    _Icon = "doc";
                    break;
                case ".doc":
                    _FileType = "word";
                    _Icon = "doc";
                    break;
                case ".xlsx":
                    _FileType = "excel";
                    _Icon = "xls";
                    break;
                case ".xls":
                    _FileType = "excel";
                    _Icon = "xls";
                    break;
                case ".pptx":
                    _FileType = "ppt";
                    _Icon = "ppt";
                    break;
                case ".ppt":
                    _FileType = "ppt";
                    _Icon = "ppt";
                    break;
                case ".txt":
                    _FileType = "txt";
                    _Icon = "txt";
                    break;
                case ".pdf":
                    _FileType = "pdf";
                    _Icon = "pdf";
                    break;
                case ".zip":
                    _FileType = "rar";
                    _Icon = "zip";
                    break;
                case ".rar":
                    _FileType = "rar";
                    _Icon = "rar";
                    break;
                case ".png":
                    _FileType = "image";
                    _Icon = "png";
                    break;
                case ".bmp":
                    _FileType = "image";
                    _Icon = "bmp";
                    break;
                case ".gif":
                    _FileType = "image";
                    _Icon = "gif";
                    break;
                case ".jpg":
                    _FileType = "image";
                    _Icon = "jpeg";
                    break;
                case ".mp3":
                    _FileType = "mp3";
                    _Icon = "mp3";
                    break;
                case ".html":
                    _FileType = "html";
                    _Icon = "html";
                    break;
                case ".css":
                    _FileType = "css";
                    _Icon = "css";
                    break;
                case ".mpeg":
                    _FileType = "video";
                    _Icon = "mpeg";
                    break;
                case ".mov":
                    _FileType = "video";
                    _Icon = "mov";
                    break;
                case ".mp4":
                    _FileType = "video";
                    _Icon = "mp4";
                    break;
                case ".pds":
                    _FileType = "pds";
                    _Icon = "pds";
                    break;
                case ".ttf":
                    _FileType = "ttf";
                    _Icon = "ttf";
                    break;
                case ".swf":
                    _FileType = "video";
                    _Icon = "swf";
                    break;
                default:
                    _FileType = "other";
                    _Icon = "new";
                    //return "else.png";
                    break;
            }
            FileType = _FileType;
            Icon = _Icon;
        }
  /// <summary>
        /// 保存文件表相关数据
        /// </summary>
        /// <param name="disData"></param>
        /// <param name="fileName"></param>
        /// <param name="ContentLength"></param>
        /// <param name="FileEextension"></param>
        /// <param name="Icon"></param>
        /// <param name="FileType"></param>
        /// <param name="fullallname"></param>
        /// <param name="hostPath"></param>
        /// <param name="db"></param>
        /// <param name="transaction"></param>
        /// <param name="IsOk"></param>
        /// <param name="entity"></param>
        private void Save_NetworkFile(DistributionData disData, string fileName, string ContentLength, string FileEextension, string Icon, string FileType, string fullallname, string hostPath, IDatabase db, DbTransaction transaction, ref int IsOk, ref Entity.Base_NetworkFile entity)
        {
            entity = new Entity.Base_NetworkFile();
            //文件记录信息写入数据库
            entity.NetworkFileId = CommonHelper.GetGuid;
            entity.CreateDate = DateTime.Now;
            entity.CreateUserId = disData.UserAccount;
            entity.CreateUserName = disData.UserName;
            entity.FolderId = disData.StationCodes;
            entity.FileName = fileName;
            entity.FilePath = fullallname.Replace(hostPath, "");
            entity.FileSize = ContentLength;
            entity.FileExtensions = FileEextension;
            entity.Icon = Icon;
            entity.FileType = FileType;
            entity.Enabled = 1;
            entity.SourceId = disData.SourceId;
            entity.Type = disData.TypeId;
            entity.TypeDescribe = disData.TypeDescribe;
            IsOk = db.Insert(entity, transaction);
        }

全部准备完毕之后再次调用
在这里插入图片描述
个人记录,不喜勿喷

参考文章:
https://blog.csdn.net/qq_36445227/article/details/106353791
https://www.cnblogs.com/kingCpp/p/4901268.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring篇】基于xml的自动装配

&#x1f353;个人主页&#xff1a;个人主页 &#x1f352;系列专栏&#xff1a;SSM框架 自动装配&#xff1a; 根据指定的策略&#xff0c;在IOC容器中匹配某一个bean&#xff0c;自动为指定的bean中所依赖的类类型或接口类 型属性赋值 ①场景模拟 创建类UserControllerpublic…

29.图像卷积代码实现

1. 互相关运算 接下来&#xff0c;我们在corr2d函数中实现如上过程&#xff0c;该函数接受输入张量X和卷积核张量K&#xff0c;并返回输出张量Y。 import torch from torch import nn from d2l import torch as d2ldef corr2d(X,K): # X是输入&#xff0c;K是核矩阵计算二维互…

Cambridge IGCSE Chemistry 真题讲解1

考试局&#xff1a;Cambridge Assessment International Education (CAIE)考试类别&#xff1a;Cambridge International General Certificate of Secondary Education (IGCSE)考试科目&#xff1a;Chemistry考试单元&#xff1a;Paper 2 Multiple Choice (Extended)试卷代码&a…

什么是混合云、公有云、私有云?

很多用户都不清楚混合云、公有云、私有云的定义是什么&#xff0c;很多用户都不是很清楚具体的含义接下来一起跟着小编来看看吧。 一、混合云( hybrid cloud) 在混合云模式中&#xff0c;云平台由两种不同模式(私有或公有)云平台组合而成。这些平台依然是独立实体&#xff0c;但…

GIt远程仓库pull拉取代码

GIt远程仓库pull拉取代码 git教程可以参考之前的这篇文章使用git命令对gitee存放项目到仓库、切换分支以及合并分支教程 这篇文章主要说一下远程连接拉去并提交代码 如果你使用git clone <项目地址>拉取代码后更改无法提交的问题&#xff0c;可以使用以下解决方案 本地…

C++基础学习笔记(三)——核心编程PART1

参考链接&#xff1a;https://www.bilibili.com/video/BV1et411b73Z?p84&vd_sourceb4d9cee68649c8adcb1e266f7147cd5c 一、内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理…

LeetCode 92 双周赛

2481. 分割圆的最少切割次数 圆内一个 有效切割 &#xff0c;符合以下二者之一&#xff1a; 该切割是两个端点在圆上的线段&#xff0c;且该线段经过圆心。该切割是一端在圆心另一端在圆上的线段。 一些有效和无效的切割如下图所示。 给你一个整数 n &#xff0c;请你返回将…

从CRUD到入职阿里,全靠猛刷P8总结的Github所有高热度面试题合集

很多工作过了 5 年之后的工程师&#xff0c;都表示写不动 CRUD 代码了&#xff0c;都会考虑转架构师&#xff0c;但是一想到面试&#xff0c;可能心里就会一紧。 一般面试大厂架构师的岗位至少需要 3 轮技术面试&#xff0c;我咨询了一下阿里的大佬&#xff0c;了解到每一轮的…

专利解析|数据中台—数据流配置弹框交互优化方法

优化用户交互 在企业信息化转型的过程中&#xff0c;数据中台提供全行业从咨询规划到技术平台落地运营的数字化方案。随着企业规模的不断扩大&#xff0c;企业信息化转型的必要性也逐步地增加&#xff0c;其功能的复杂度更是跨越式地增加。人们在处理信息、学习规程和记忆细节…

【Go】参数验证,对象数组核验-validator

文章目录背景功能介绍范围比较验证标记之间特殊符号说明字符串验证特殊字符串验证例子扩展问题我的问题验证slice举例输出说明详细举例二维slice举例&#xff1a;说明map核验举例输出说明嵌套map核验举例说明参考背景 一直做的 go 项目中想要方便简洁的对接口参数字段进行核验…

HTTP模块的数据结构

1.ngx_module_t 1.1数据定义 背景&#xff1a; ngx_module_t结构体作为所有模块的通用接口&#xff0c;它只定义了init_master、init_module、init_process、init_thread、ext_thread、exit_process、exit_master这7个回调方法&#xff08;事实上&#xff0c;init_master、i…

DEJA_VU3D - Cesium功能集 之 090-台风过境实时动画

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小130个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(尽可能把代码简洁一些)。博文内容…

内网穿透软件对比——cpolar : 花生壳(上)

系列文章 内网穿透软件对比——cpolar : 花生壳&#xff08;上&#xff09;内网穿透软件对比——cpolar : 花生壳&#xff08;中&#xff09;内网穿透软件对比——cpolar : 花生壳&#xff08;下&#xff09; 文章目录系列文章1. 前言2. 对比内容2.1 官网主页对比2.2 用户注册…

JS中的事件循环机制(Event Loop)

JS中的事件循环机制(Event Loop) javascript是单线程的非阻塞的脚本语言 单线程 只有一个主线程来处理任务。非阻塞 JS引擎执行异步任务时&#xff0c;不会一直等待返回结果&#xff0c;主线程会挂起&#xff08;pending&#xff09;这个任务&#xff0c;继续执行其他任务&am…

微三云(陈志坤):共享购商业模式概念、框架、基础制度

各位企业家及创业者朋友们&#xff0c;你们好。我是微三云&#xff08;陈志坤&#xff09;&#xff0c;在你打开这个文章的时候&#xff0c;先不要急&#xff0c;因为任何一个能够长久、安稳、盈利的平台&#xff0c;背后肯定有一位看准宏观方向且耐心的人。这是一个极具颠覆性…

php宝塔搭建部署实战零起飞OA办公管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的零起飞OA办公管理系统源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板文字搭建教程 下载源码&#xff0c;宝…

Mybatis对MySQL中BLOB字段的读取

一、使用TEXT还是BLOB&#xff1f; 1、TEXT和BLOB主要差别 主要差别就是BLOB保存二进制数据&#xff0c;TEXT保存字符数据。 目前几乎博客内容里图片都不是二进制存储在数据库的&#xff0c;而是把图片上传到服务器&#xff0c;然后正文里使用<img>标签引用&#xff0c…

电脑系统下载的镜像文件在哪里图解

如果你在小白系统上面下载了镜像文件&#xff0c;但是不知道下载完成怎么找到它的话&#xff0c;下面就和小编一起来看一下小白系统下载的镜像文件知道方法。 工具/原料&#xff1a; 系统版本&#xff1a;windows10系统 品牌型号&#xff1a;惠普战66五代 方法/步骤&#x…

C/C++程序的断点调试 - Microsoft Visual Studio

本文以Microsoft Visual Studio为例&#xff0c;简述C/C程序断点调试的基本方法和过程。其它的IDE环境&#xff0c;大同小异。 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff…

【BFS】八数码问题(c++基础算法)

目录 一.读题 二.在做题之前 1.康拓展开 2.DFS和BFS的区别 3.栈和队列的区别 三.做题 1.算法原理 2.算法实现 ①队列 ②康托展开 ③标记 四.AC代码 一.读题 作为最经典的一道宽度优先搜索题&#xff0c;它的题面并不是很难懂。 【宽搜&#xff08;难度&#xff1a;6&a…