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

news2024/11/18 11:19:27

这次的需求是请求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;
        }

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

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

相关文章

控制RK3568的GPIO

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、设备树中是如何描述引脚的&#xff1f;1.pinctrl子系统2.gpio子系统二、使用步骤总结前言 RK3568的引脚资源还是相当多的&#xff0c;一共有5组GPIO&#x…

数图互通高校房产管理——房屋修缮管理

数图互通房产管理系统在这方面做得比较全面&#xff1b; 实现房屋修缮改造、装修维护、零星维修线上管理&#xff0c;建立机制规范管理&#xff0c;避免私自改扩建。 建筑物立项审批全流程资料和过程管理&#xff0c;建筑物修建施工、维修审批流程管理。整套系统包含了建筑物从…

链下签名实现

什么是签名 比如我们在使用 opensea 的时候&#xff0c;经常会提示我们进行数字签名&#xff0c;如下图&#xff1a; 用户进行 sign 确认&#xff0c;即用自己的私钥对一段数据进行签名&#xff0c;得到一个 signature&#xff0c;其他人可以使用你私钥对应的公钥&#xff0c…

推荐5款Windows桌面效率工具

今天我想分享一些自己比较喜欢的桌面端软件&#xff0c;还请大家包涵指正。如果你曾搜索过 Windows 效率工具推荐&#xff0c;对下文的软件或许有所了解。不过为了凑字数&#xff0c;我还是会再介绍一遍。 1.文件定位——Listary Listary 是我使用频率最高的软件之一&#xf…

Java重点源码回顾——HashMap1.8

1. 概述 在之前的文章中&#xff0c;我们介绍了HashMap1.7的源码&#xff0c;今天我们来看下HashMap1.8的源码。HashMap1.8相比于1.7最大的改变就是改变了1.7中采用数组链表的方式存储键值对&#xff0c;转而由数组链表红黑树的方式来存储键值对。HashMap1.8的底层结构如下图所…

RPC 好,还是 RESTful 好

OSI网络七层模型 RPC服务 RPC架构 同步调用与异步调用 流行的RPC框架 HTTP服务 总之 RPC主要是基于TCP/IP协议的&#xff0c;而HTTP服务主要是基于HTTP协议的&#xff0c;我们都知道HTTP协议是在传输层协议TCP之上的&#xff0c;所以效率来看的话&#xff0c;RPC当然是要更…

【python】py课后作业程序题5「PTA」

py字典合集7-1 Python猜数游戏7-2 jmu-python-分段函数7-3 循环求e的近似值&#xff08;高教社&#xff0c;《Python编程基础及应用》习题6-7&#xff09;7-4 jmu-python-判断是否构成三角形7-5 jmu-python-输入输出-计算字符串中的数7-6 jmu-python-随机生成密码7-7 jmu-pytho…

vscode使用CMake Tool插件构建第一个CMake的helloworld工程

vscode使用CMake Tool插件构建第一个CMake的helloworld工程一、linux环境准备1.1 CMake安装1.2 gcc/g的安装二、vscode 插件安装2.1 C扩展2.2 CMake Tool三、使用CMake构建第一个工程3.1 创建工程目录3.2 使用CMake Tool创建第一个Project3.3 Configure 第一个project四、构建工…

Java中序列化接口Serializable的serialVersionUID的作用

原文网址&#xff1a;Java中序列化接口Serializable的serialVersionUID的作用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java中序列化接口Serializable的serialVersionUID的作用。 序列化与反序列化 含义 序列化&#xff1a;将java对象转化为字节序列。反序列化&#xff1a…

【mysql】索引的基本使用

文章目录1. 索引的声明与使用1.1 索引的分类1.2 创建索引1.2.1 创建表的时候创建索引&#xff08;隐式&#xff09;1.2.2 在已经存在的表上创建索引&#xff08;显式&#xff09;1、创建普通索引2、创建唯一索引3、主键索引4、创建单列索引5、创建联合索引6、创建全文索引7、创…

33、基于STM32的计时器(Proteus仿真+程序)

编号&#xff1a;33 基于STM32的计时器 功能描述&#xff1a; 使用proteus 软件设计一个基于STM32的家用计时器&#xff0c;该系统包含多个按键、LED运行灯和时间显示(时间显示是LCD1602) 其功能如下: 1、利用按键实现设置计时时间功能&#xff0c;时间格式:AB:CD:E 例如01:5…

【攻防世界】江苏工匠杯 Web easyphp

打开页面是一个代码审计的题目&#xff0c;是我不太熟悉的东西&#xff0c;但是没关系&#xff0c;我们可以学是吧&#xff0c;以下为源代码 <?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 60…

【ES实战】ES集群节点迁移与缩容

ES集群节点迁移与缩容 文章目录ES集群节点迁移与缩容master节点迁移场景一场景二场景三data节点迁移数据迁移操作1、查询集群原来的配置2、清空节点数据3、检查是否排空数据迁移原则缩容前置检查项master节点迁移 场景一 集群上的master部署情况&#xff0c;一台机器上同时部…

智能化IT运维平台建设方案,基于智和信通运维体系的高敏捷二次开发

随着企业信息进程不断加速&#xff0c;运维人员需要面对越来越复杂的业务和越来越多样化的用户需求&#xff0c;不断扩展的应用需要越来越合理的模式、越来越智能的工具来保障运维能灵活便捷、安全稳定地开展。企业网络规模的不断扩大&#xff0c;从初期的几台服务器发展到庞大…

Python3 | vscode配置环境

vscode版本&#xff1a;1.74.2python版本&#xff1a;3.9.0win10系统 准备工作&#xff0c;在win10系统 1&#xff0c;安装python3&#xff0c;配置环境变量2&#xff0c;安装vscode 接下来&#xff1a;就可以在vscode配置python环境 1&#xff0c;下载和安装python插件 快…

2022年总结以及2023年的计划

2022年总结以及2023年的计划 文章目录2022年总结以及2023年的计划年终复盘投资理财学习方面前端方面&#xff1a;后端方面&#xff1a;数据库&#xff1a;读书&#xff1a;疫情工作爱情新的一年的展望按照每年的惯例&#xff0c;我每年的总结&#xff0c;复盘会在这几天完成。 …

软件测试精准定位BUG小技巧

目录 一、前置知识 二、定位技巧 一、前置知识 1. 熟透系统业务、团队成员情况 2. 熟悉使用F12或抓包工具 3. 了解HTTP/HTTPS协议&#xff0c;能够区分请求URL、请求头、请求体、入参、响应数据、响应码 4. 具备操作常规Linux命令&#xff0c;能否登入服务器查看Log日志&…

通信原理 | 波段的划分

波段(wave band) 在无线电技术中,波段(wave band)这个名词具有两种含义。 电磁波频谱的划分,例如长波、短波、超短波等波段。 发射机、接收机等设备的工作频率范围的划分。若把工作频率范围分成几个部分,这些部分也称为波段,例如三波段收音机等。 波段划分 波段通常是…

Python实现A股股市情感分析,含数据集可直接运行

Python实现A股股市情感分析&#xff0c;含数据集可直接运行 Stock Market Sentiment Analysis: 股市情感分析 完整代码下载地址&#xff1a;Python实现A股股市情感分析 情绪与股市 情绪与股市关系的研究由来已久&#xff0c;情绪是市场的一个重要影响因素已成为共识。 15年…

【设计模式】状态模式

状态模式 状态机 在操作系统的调度中会存在三种状态&#xff1a;运行、就绪、阻塞。 这是比较典型的状态机的例子。 做产品的时候&#xff0c;我们总能遇到一些比较复杂的逻辑问题&#xff0c;而普通的流程图&#xff0c;或时序图对于对象和状态的解读缺乏直观的描述。 这…