首页 > 其他分享 >WebAPi实现多文件上传,并附带参数

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

时间:2023-05-05 13:33:07浏览次数:42  
标签:WebAPi case string 附带 FileType entity break 上传 Icon

1、目的及需求

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

 2、参数说明

这里先说明以下需要的文件说明参数类

   /// <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; }
    }
View Code

3、首次调用

Api上传方法写好之后直接ApiPost调用结果如下

4、添加包 

调用失败后,通过参考https://www.cnblogs.com/kingCpp/p/4901268.html文章发现需要实现此效果可以通过添加【MultipartDataMediaFormatter】Nuget包

 

5、配置

添加包之后需要对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 }
            );
        }
    }
View Code

配置好之后再次调用接口发现参数已经可以拿到

 

6、文件获取

接下来就是获取文件了,文件我们可以直接在具体的上传方法中通过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;
        }
View Code

 7、具体实现

这样参数与文件就都获取到了,再就是具体上传与保存记录了

接口返回数据格式如下:

 上传文件具体方法:

  /// <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;
        }
View Code
      /// <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;
        }
View Code
  /// <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);
        }
View Code

8、最终效果

全部准备完毕之后再次调用

 

标签:WebAPi,case,string,附带,FileType,entity,break,上传,Icon
From: https://www.cnblogs.com/lwk9527/p/17373631.html

相关文章

  • Java Web超大文件上传和断点续传的实现
    ​前言文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比......
  • vue 选择图片或者拍照上传,数据在外层取不到/拿不到解决。
    <inputtype="file"accept="image/*"capture="camera"@change="onImageChange"class="inputClass"/>//调用asynconImageChange(e){this.capImg=awaitthis.onImageChange(e)console......
  • powershell实现http上传文件
    服务端代码#监听IP地址和端口$ip="127.0.0.1"$port=8080#设置上传目录$uploadDir="D:\uploads"#创建HttpListener对象并启动监听$listener=New-ObjectSystem.Net.HttpListener$listener.Prefixes.Add("http://$ip`:$port/")$listener.Start()......
  • CentOS 下修改 WordPress 文件上传大小限制
    CentOS下可以通过修改php.ini来设置WordPress 文件上传大小限制。默认的php.ini文件是在/etc下。(对应的包:php-common)修改下面的几个参数:upload_max_filesize=64Mpost_max_size=64Mmax_execution_time=300修改后重启httpd。$servicehttpdrestart这样上传文......
  • github修改好代码后上传已有仓库
    github修改好代码后上传已有仓库在GitHub上修改代码并将其推送到已有仓库的步骤如下:确保您的本地代码与GitHub仓库中的代码是同步的。您可以使用gitpull命令从远程仓库中获取最新代码并将其合并到您的本地代码中。如果您在本地进行了修改,请确保将其推送到远程仓库之前进行提交......
  • vue 原生方法实现pc端调用摄像头全屏视频考试(实时截屏上传,并提示当前环节
    <template><div><el-row><el-col:span="10"style=""><div><el-cardstyle="margin:0;padding:0;overflow-y:auto"><divstyle="width:100......
  • 基于ChatGPT的文档知识库客服系统-支持上传网址/文本/docx等数据
    现在,很多公司都有自己的内容知识库,会产生大量的碎片话的内部知识,但是这样内部知识难以整合搜索。我开发的文档知识库客服系统gofly.v1kf.com,可以应用于企业内部知识库管理,用户可以使用自然语言提问,让ChatGPT自动归纳总结企业知识信息,帮助员工快速获取所需知识,提升资源流转效率......
  • 解决上传md文件时出现的“<Fault 401: '请配置正确的用户名与访问令牌(access token),
    使用的工具:pycnbolg下载地址:https://github.com/dongfanger/pycnblog具体操作按这位大神的博客:如何在博客园上传markdown文件-NotYourferry-博客园(cnblogs.com)出现报错如图:偶然看到这两位的评论:于是我将config.yaml中的password改成了我的令牌,就上传成功了。......
  • Salesforce LWC学习(四十三) lwc 零基础学习路径的视频已上传B站
    本篇参考:https://www.bilibili.com/video/BV1QM411G7pN/还记得salesforce零基础学习(一百二十五)零基础学习SF路径 中描述的那样,预计今年年底以前基于0基础学习的内容录制成视频,更好的更方便的进行学习和互动。当时的一个动机是以前公司做veeva的同事或者java以及.net转过来的同事......
  • 常见问题——关于.net WebApi使用Swagger报错:HTTP Error 403.14 - Forbidden
    问题:.netWebApi项目使用Swagger报错:HTTPError403.14-Forbidden解放方案:换一个端口即可推荐——删除解决方案下的.vs文件夹,重新生成即可参考:https://stackoverflow.com/questions/34970088/swagger-gives-me-http-error-403-14-forbidden/53863456......