c# http请求使用multipart/form-data 方式上传文件及其他参数

2023-05-16

这次的需求是请求java那边的一个excel批量上传的接口。但是他们的接口要求是这样的

 于是自己写了个方法:

调用:

控制器层

                var file = this.HttpContext.Request.Files[0];//获取前端传来的文件
                var fileName = file.FileName;

                //注意:Stream不能做参数传,所以转成byte用来传值

                byte[] fileByte = FileUtil.StreamToBytes(file.InputStream);

代理层
 

            IOscarResult result = new IOscarResult();
            try
            {

                Dictionary<string, string> headerDict = new Dictionary<string, string>();
                headerDict.Add("userId", 54000); //header userid
                NameValueCollection par = new NameValueCollection();
                par.Add("dataSource", "数据源"); //数据源
                dynamic fileInfo = new ExpandoObject();
                fileInfo.fileName = fileName; //文件名
                fileInfo.fileByte = fileByte; //文件字节
                fileInfo.file = "file"; //字段名
                //请求
                string response = WebApiProxy.PostMultipartFormDataAsync(NodeName.IOscarBaseSystemApi, "extends/rpc/org/upload", headerDict,  par, fileInfo);
                result = JsonConvert.DeserializeObject<IOscarResult>(response);
            }
            catch (System.Exception ex)
            {
                result.Success = false;
                result.Msg = "异常:" + ex.ToString();
            }

//http请求方法:

        /// <summary>
        /// 使用multipart/form-data方式上传文件及其他数据
        /// </summary>
        /// <param name="requestUrl">请求接口地址</param>
        /// <param name="headers">自定义header</param>
        /// <param name="nameValueCollection">键值对参数</param>
        /// <param name="fileInfo">文件信息</param>
        /// <returns></returns>
        public static string PostMultipartFormDataAsync( string requestUrl, Dictionary<string, string> headers, NameValueCollection nameValueCollection, dynamic fileInfo)
        {
            var data = "";
            using (var httpClient = new HttpClient())
            {
                try
                {

                    //header参数
                    foreach (var item in headers)
                    {
                        httpClient.DefaultRequestHeaders.Add(item.Key, item.Value);
                    }

                    using (var reduceAttach = new MultipartFormDataContent())
                    {
                        #region 键值对参数
                        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
                            };
                            reduceAttach.Add(dataContent);
                        }
                        #endregion

                        #region 文件参数
                        if (fileInfo != null)
                        {
                            Stream fileStream = FileUtil.BytesToStream(fileInfo.fileByte);//转成stream流
                            var streamContent = new StreamContent(fileStream);
                            var Content = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result);//创建文件的content
                            reduceAttach.Add(Content, fileInfo.file, fileInfo.fileName);
                            streamContent.Dispose();
                        }
                        #endregion

                        //请求
                        var response = httpClient.PostAsync(requestUrl, reduceAttach).Result;
                        data = response.Content.ReadAsStringAsync().Result;
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            return data;
        }

        /// 将 Stream 转成 byte[]

        public static byte[] StreamToBytes(Stream stream)
        {
            byte[] bytes = new byte[stream.Length];
            stream.Read(bytes, 0, bytes.Length);
            // 设置当前流的位置为流的开始
            stream.Seek(0, SeekOrigin.Begin);
            return bytes;
        }

        /// 将 byte[] 转成 Stream

        public static Stream BytesToStream(byte[] bytes)
        {
            Stream stream = new MemoryStream(bytes);
            return stream;
        }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c# http请求使用multipart/form-data 方式上传文件及其他参数 的相关文章

  • 检查 Javascript 中的 URL 是否损坏

    这个问题之前已经发布在 Stack 上 但没有一个具体到我想要理解的内容 检查 URL 是否正确的最简单方法是发送 http Head 请求 但是如何使用它来指定 URL 呢 我在之前的帖子中发现了这一点 function UrlExist
  • gradle - 从 url 下载并解压文件

    从 url 下载和解压文件的正确 gradle 方法是什么 http 如果可能的话 我想防止每次运行任务时重新下载 在ant get可以通过以下方式实现skipexisting true 我当前的解决方案是 task foo ant get
  • 创建 JSON 对象并将其转换为 Java 中的 String

    我需要通过 http post 发送一个相当长的 JSON 标头 在Python中是这样的 self body header client self client name clientRevision self client versio
  • 无法更改 php 会话 cookie 名称

    我将现有且成功运行的站点复制到新的开发服务器 新服务器上的登录现在已损坏 我追踪到虽然会话 cookie 已重命名 ini set session name DOMAIN1 浏览器继续将会话 cookie 存储为 PHPSESSID 当我从
  • 使用 php 和 jquery 的简单彗星示例

    谁能给我一个使用 PHP 的彗星技术的简单好例子 我只需要一个使用持久 HTTP 连接或类似连接的示例 我不想使用轮询技术 因为我已经设置了类似的东西 并且不仅难以使用和管理它的大量资源 另外我使用的是 IIS7 而不是 Apache 一个
  • 在获得响应之前发出多个请求

    当并行发送多个请求时 在获得响应之前 我无法理解 HTTP 的工作原理 有两种情况 1 With Connection Keep Alive 根据HTTP规范 http www w3 org Protocols rfc2616 rfc261
  • AngularJS $http 错误时 http 状态错误

    我正在尝试使用 AngularJS 的 http 服务构建 JSONP 请求 并且在出现错误时 我收到错误的 http 状态代码 404 而不是 500 并且页面正文也丢失了 所以这是场景 我调用的 URL 返回 500 内部服务器错误 并
  • 响应中的有效 JSON

    我正在开发客户端和服务器应用程序 遇到了一个有趣的问题 我们正在创建一个 Restful API 并通过 JSON 响应与客户端进行通信 执行 DELETE 时 我们将返回 200 OK 和空白响应 我们的客户收到 200 OK 但解析 J
  • Angular 显示每个 HTTP 请求的微调器,只需很少的代码更改

    我正在开发一个现有的 Angular 应用程序 版本是 Angular 4 该应用程序从许多不同的组件对 REST API 进行 HTTP 调用 我想为每个 HTTP 请求显示一个自定义微调器 由于这是一个现有的应用程序 因此有很多地方调用
  • TRESTRequest:是否可以在 POST 请求中使用自定义媒体类型?

    例如 我们有一个 API 需要我们自己的供应商特定内容类型application vnd xxxx custom custom data json但查看 REST Client 的源代码 它似乎总是默认为 REST Types 中的 Con
  • 构建可扩展 Web 应用程序的书籍? (数据库性能/调优、网络、一般性能等)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 从计算机科学专业毕业并作为一名从事 Web 应用程序的软件工程师进入 现实世界 后 我对如何正确扩展 W
  • 通过 HTTPS 包含 Twitter Widgets.js

    当我们包含以下内容时 我在我们网站上的 HTTPS 服务页面上的混合内容方面遇到了一个小问题http platform twitter com widgets js http platform twitter com widgets js
  • 如何从 Kubernetes 服务背后的 HTTP 请求读取客户端 IP 地址?

    我的 Web 应用程序作为 Kubernetes pod 在 SSL 的 nginx 反向代理后面运行 代理和我的应用程序都使用 Kubernetes 服务进行负载平衡 如所述here http blog kubernetes io 201
  • HTTP 查询字符串和 []

    PHP 使用 在查询参数名称中 以确保多次出现的参数都出现在 GET超全局变量 否则只出现最后一次出现的情况 还有其他软件可以做到这一点吗 但从RFC 3986 https www rfc editor org rfc rfc3986 以及
  • 内容长度标头与分块编码

    我正在尝试权衡设置的利弊Content LengthHTTP 标头与使用分块编码从我的服务器返回 可能 大文件的比较 使用持久连接需要其中之一来符合 HTTP 1 1 规范 我看到了的优点Content Length标头是 下载对话框可以显
  • 从开放的 HTTP 流中读取数据

    我正在尝试使用 NET WebRequest WebResponse 类来访问 Twitter 流 API 此处 http stream twitter com spritzer json 我需要能够打开连接并从打开的连接中增量读取数据 目
  • ReverseProxy取决于golang中的request.Body

    我想构建一个 http 反向代理 它检查 HTTP 主体 然后将 HTTP 请求发送到它的上游服务器 你怎么能在 Go 中做到这一点 初始尝试 如下 失败 因为 ReverseProxy 复制传入请求 修改它并发送 但正文已被读取 func
  • 使用 Google OAuth2.0 时出现错误请求

    从 Salesforce 中使用 Google OAuth 时 我收到 400 错误请求 以下错误与无效的 grant type 有关 但如果您查看 使用刷新令牌 下的文档 您会发现它是正确的 https developers google
  • Golang 优雅地关闭 HTTP 服务器并进行错误处理

    我正在让我的 HTTP 服务器正常关闭 我从帖子中获取了提示here https stackoverflow com questions 39320025 how to stop http listenandserve 并且到目前为止已经像
  • 服务器返回网页 404,但页面在浏览器中显示正常 - 为什么?

    一个奇怪的网页横亘在我面前 作为一名开发人员 我必须解开这个谜团 在任何浏览器中访问网页时 一切似乎都很正常 网页按预期显示 但是当查看控制台时 服务器实际上返回了 404 状态代码 那么浏览器为什么要渲染页面呢 查看正文显示返回了有效的

随机推荐