首页 > 其他分享 >.Net使用HttpClient以multipart/form-data形式post上传文件及其相关参数

.Net使用HttpClient以multipart/form-data形式post上传文件及其相关参数

时间:2023-05-23 17:46:25浏览次数:49  
标签:return form multipart var new Net data public

httpClient模仿Postman的form-data格式

 api接口

 [HttpPost(Name = "/Test/FileTest")]
        public JGResponse<PutFileByNameResponse> FileTest([FromForm]PutFileByNameRequest requestDto)
        {
            var capthch = GetCaptcha();
            var token = GetToken(capthch.Data);

            requestDto.jptlAuth = token.Data.access_token;
            var result = RegulatoryPlatformSDK.PutFileByName(requestDto);
            return result;
        }

接口对象

public class JGRequestDto
    {
        /// <summary>
        /// 验证码
        /// </summary>
        [Required]
        [Description("jptl-auth")]
        public string jptlAuth { get; set; }
    }

public class PutFileByNameRequest : JGRequestDto
    {
        /// <summary>
        /// 文件
        /// </summary>
        public IFormFile file { get; set; }

        /// <summary>
        /// 文件名
        /// </summary>
        public string fileName { get; set; }
    }

第三方接口请求

public string Upload(UploadRequestDto dto)
        {
            if (dto == null)
                return "";

            //请求
            var url = SDKConfig.Host + "/third-service/upload";
            List<ByteArrayContent> list = new List<ByteArrayContent>();

            var interfaceCode = new ByteArrayContent(Encoding.UTF8.GetBytes(dto.interfaceCode));
            interfaceCode.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "interfaceCode" };
            list.Add(interfaceCode);

            var param = new ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(dto.param)));
            param.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "param" };
            list.Add(param);

            var file = new ByteArrayContent(ReadFileBytes(dto.file));
            file.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data") { Name = "file", FileName = dto.param["fileName"].ToString() };
            list.Add(file);

            var content = new MultipartFormDataContent();
            Action<List<ByteArrayContent>> act = (dataContents) =>
            {
                foreach (var byteArrayContent in dataContents)
                {
                    content.Add(byteArrayContent);
                }
            };
            act(list);

            var response = RequestHelper.HttpPostToFormData(url, content);  //, "application/x-www-form-urlencoded"
            var responseJson = new ResponseDto<JGResponse<PutFileByNameResponse>>();
            try
            {
                responseJson = JsonConvert.DeserializeObject<ResponseDto<JGResponse<PutFileByNameResponse>>>(response);
            }
            catch (Exception)
            {
                var json = JsonConvert.DeserializeObject<ResponseDto<string>>(response);
                return json.Data;
            }
            if (responseJson == null)
                return "";
            return JsonConvert.SerializeObject(responseJson.Data);
        }
private static Byte[] ReadFileBytes(IFormFile fileData)
        {
            byte[] data;
            using (var ms=new MemoryStream())
            {
                fileData.CopyTo(ms);
                data = ms.ToArray();
            }

            return data;
        }

post请求

 /// <summary>
        /// 发起POST异步请求
        /// </summary>
        /// <param name="url"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string HttpPostToFormData(string url, MultipartFormDataContent formData)
        {
            string result = null;
            try
            {
                HttpClient httpClient = new HttpClient();
                HttpResponseMessage response = httpClient.PostAsync(url, formData).Result;
                if (response.IsSuccessStatusCode)
                {
                    result = response.Content.ReadAsStringAsync().Result;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return result;
        }

 

标签:return,form,multipart,var,new,Net,data,public
From: https://www.cnblogs.com/xiaoxiaomini/p/17425906.html

相关文章

  • Asp.Net中的Fillter
    Asp.net中一共有五种FillterAuthorizationFilter授权过滤器IResourceFilter资源管理过滤器IActionFilter行为过滤器IExceptionFilter异常过滤器IResultFilter结果过滤器publicclassCtmActionFilterAttribute:Attribute,IActionFilter{publicvo......
  • Winform虚拟/模拟键盘
    项目需要在触摸屏上增加一个虚拟键盘。记录下过程中遇到的问题及解决方法。1.模拟按键网上找到如下3种方法1)SendKeys.Send测试单独的shift不好用,所以最终未采纳此方法SendKeys.Send("^{E}");//shift+eSendKeys.Send("{Enter}");2)keybd_event最终选择了这个方法,简单有效......
  • 【Java Web】MultipartFile和byte[]互转
    接口接收文件@RequestParam("file")MultipartFilefileMultipartFile转byte[]Stringname=file.getName();StringoriginalFilename=file.getOriginalFilename();StringcontentType=file.getContentType();Stringbytes=file.getBytes();byte[]转Multipar......
  • C# Winform按钮避免重复点击
    btn_01.Enabled=false;//执行任务的函数和代码//执行任务的函数和代码Application.DoEvents();btn_01.Enabled=true;就是让应用程序的消息队列自动走完(在按钮正常前清空消息队列即可)......
  • form+iframe 实现ajax文件上传
    在做文件上传时除了传入文件外,还有附件参数,并且要求不刷新页面,之前是表单提交的方式,现在修改成ajax上传的方式,由于没有选择用插件,所以用form+iframe的方式,并且这种方式对IE8以上及主流浏览器都支持。1、首先写一个iframe<iframename="myiframe"style="display:none;"onload=......
  • 2步轻松实现ASP.NET Core托管服务执行定时任务
    最近接到一个新项目,需要在项目里添加一个后台任务,定时去发邮件通知客户;由于是一个比较小型的项目,不希望引入Quartz.Net、Hangfire等太重的框架,同时也没持久化要;寻觅了一下发现ASP.NETCore本身带有托管服务,可以执行定时任务。ASP.NETCore提供了IHostedService接口,它使我们能够创......
  • .NET中SQL Server数据库连接方法
    1. 使用本机上的SQLServerExpress实例上的用户实例。     用户实例的连接创建了一个新的SQLServer实例。此连接只能是在本地SQLServer2005实例上并且是通过命名管的windows验证连接才有效。目的就是为了给用户创建一个完全权限的SqlServer实例和有限的计算机管理员......
  • c# winform定时刷新
     Thread多线程publicpartialclassForm2:Form{//横向滚动条记录的是像素位数//竖向滚动条记录的行的索引值intVerticalScrollIndex=0;intHorizontalOffset=0;publicForm2(){Initializ......
  • .net6中数据库查询报错:'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT 的用法无
    错误语句:在数据库查询中使用skip()问题原因:数据库版本为SQLServer2008,不支持'Fetch'和'Next'语句SQLServer2012及后续版本才支持相关语句解决方法:1.引用包: System.Data.SqlClient和EntityFrameworkCore.UseRowNumberForPaging2.使用:在Program.cs中调整数据库连接bu......
  • .Net6自定义拦截器
    .Net6自定义拦截器拦截器是Aop(面向切面编程)的思想指的是不改变原代码封装的前提下去实现更多功能这里通过.net的特性(给一个目标对象添加一段配置信息)的方式去实现拦截器功能新建一个特性namespaceCorePolly{publicclassTestAttribute:Attribute{publ......