C#.NET使用multipart/form-data方式上传文件及其他数据

请求发起

.NET Framework 3.5 版

csharp 复制代码
/// <summary>
        /// 使用multipart/form-data方式上传文件及其他数据
        /// </summary>
        /// <param name="headers">请求头参数</param>
        /// <param name="nameValueCollection">键值对参数</param>
        /// <param name="fileCollection">文件参数:参数名,文件路径</param>
        /// <returns>接口返回结果</returns>
        public static string PostMultipartFormData(string url, Dictionary<string, string> headers, NameValueCollection nameValueCollection, NameValueCollection fileCollection)
        {
            using (var client = new HttpClient())
            {
                foreach (var item in headers)
                {
                    client.DefaultRequestHeaders.Add(item.Key, item.Value);
                }

                using (var content = new MultipartFormDataContent())
                {
                    // 键值对参数
                    string[] allKeys = nameValueCollection.AllKeys;
                    foreach (string key in allKeys)
                    {
                        var dataContent = new ByteArrayContent(Encoding.UTF8.GetBytes(nameValueCollection[key]));
                        dataContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                        {
                            Name = key
                        };
                        content.Add(dataContent);
                    }

                    //处理文件内容
                    string[] fileKeys = fileCollection.AllKeys;
                    foreach (string key in fileKeys)
                    {
                        byte[] bmpBytes = File.ReadAllBytes(fileCollection[key]);
                        var fileContent = new ByteArrayContent(bmpBytes);//填充文件字节
                        fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                        {
                            Name = key,
                            FileName = Path.GetFileName(fileCollection[key])
                        };
                        content.Add(fileContent);
                    }

                    var result = client.PostAsync(url, content).Result;//post请求
                    string data = result.Content.ReadAsStringAsync().Result;
                    return data;//返回操作结果
                }
            }
        }

.NET Framework 4.+ 版

csharp 复制代码
/// <summary>
        /// 使用multipart/form-data方式上传文件及其他数据
        /// </summary>
        /// <param name="headers">请求头参数</param>
        /// <param name="nameValueCollection">键值对参数</param>
        /// <param name="fileCollection">文件参数:参数名,文件路径</param>
        /// <returns>接口返回结果</returns>
        public static string PostMultipartFormData(string url, Dictionary<string, string> headers, NameValueCollection nameValueCollection, NameValueCollection fileCollection)
        {
            using (var client = new HttpClient())
            {
                foreach (var item in headers)
                {
                    client.DefaultRequestHeaders.Add(item.Key, item.Value);
                }

                using (var content = new MultipartFormDataContent())
                {
                    // 键值对参数
                    string[] allKeys = nameValueCollection.AllKeys;
                    foreach (string key in allKeys)
                    {
                        var dataContent = new ByteArrayContent(Encoding.UTF8.GetBytes(nameValueCollection[key]));
                        dataContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                        {
                            Name = key
                        };
                        content.Add(dataContent);
                    }

                    //处理文件内容
                    string[] fileKeys = fileCollection.AllKeys;
                    foreach (string key in fileKeys)
                    {
                        byte[] bmpBytes = File.ReadAllBytes(fileCollection[key]);
                        var fileContent = new ByteArrayContent(bmpBytes);//填充文件字节
                        fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
                        {
                            Name = key,
                            FileName = Path.GetFileName(fileCollection[key])
                        };
                        content.Add(fileContent);
                    }

                    var result = client.PostAsync(url, content).Result;//post请求
                    string data = result.Content.ReadAsStringAsync().Result;
                    return data;//返回操作结果
                }
            }
        }

Web API 接收接口
ASP .NET Core Web API 接口接收 multipart/form-data 文件、数据

csharp 复制代码
[HttpPost]
        //public string Post([FromForm] string directory, [FromForm] IList<IFormFile> files )
        public string Post([FromForm] string directory, [FromForm] IFormFile files)
        {
            return "";
        }

        [HttpPut]
        public string Put([FromForm] IFormFile templateFile, [FromForm] string id, [FromForm] string objectVersionNumber)
        {
            return "";
        }

ASP.NET 4.x 版

csharp 复制代码
[HttpPost(Name = "PostWeatherForecast")]
        //public string Post([FromForm] string directory, [FromForm] IList<IFormFile> files )
        public string Post([FromForm] string directory, [FromForm] IFormFile files)
        {
            // Check if the request contains multipart/form-data.
            if (!Request.ContentType.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            string root = Request.HttpContext.Current.Server.MapPath("~/App_Data");
            var provider = new MultipartFormDataStreamProvider(root);

            try
            {
                // Read the form data.
                await Request.Content.ReadAsMultipartAsync(provider);

                // This illustrates how to get the file names.
                //foreach (MultipartFileData file in provider.FileData)
                //{
                //    Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                //    Trace.WriteLine("Server file path: " + file.LocalFileName);
                //}
                //  return Request.CreateResponse(HttpStatusCode.OK);
            }
            catch (System.Exception e)
            {
                //  return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
            }

            return "";
        }
相关推荐
firstacui7 小时前
Mysql调优
android·mysql·adb
程序员-Benothing7 小时前
什么是 MySQL 的主从同步机制?它是如何实现的?
android·数据库·mysql
Android打工人7 小时前
c++ 、java 融为一体2,c++ 实例化Android虚拟机直接运行java,c,java 一个进程号
android·java·c++
IT毕设实战小研8 小时前
基于安卓的考研资讯系统设计与实现
android·大数据·vue.js·爬虫·python·考研·课程设计
Mr数据杨16 小时前
【Codex】用学生入学评估模块建立新生能力画像
android·java·javascript·django·codex·项目开发
●VON16 小时前
谁小时候不想要一个游戏修改器?我把电脑 Skill 做成了 Android 小助手
android·游戏·电脑
刃神太酷啦17 小时前
Linux 系统 MySQL 完整安装配置教程:从卸载 MariaDB 到优化 my.cnf----《Hello MySQL!》(1)
android·linux·c语言·c++·mysql·leetcode·mariadb
里欧跑得慢17 小时前
Flutter 三方库 function_tree — 鸿蒙应用开发中的动态数学公式解析与计算神器,实现鸿蒙深度适配下的复杂函数逻辑运行时求值实战(适配鸿蒙 HarmonyOS Next ohos)
android·前端·安全·flutter·华为·harmonyos
IT毕设实战小研17 小时前
基于安卓的空气质量查询系统
android·大数据·vue.js·爬虫·python·django·课程设计
leonkay17 小时前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发