当前位置: 首页 > news >正文

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

前言:

  本次要讲的是使用.Net HttpClient拼接multipark/form-data形式post上传文件和相关参数,并接收到上传文件成功后返回过来的结果(图片地址,和是否成功)。可能有很多人会说用ajax不是就可以轻松的实现吗?的确是在不存在跨域问题的前提下使用ajax上传文件,接收返回结果是最佳的选择。无奈的是我们对接的是第三方的一个上传图片的接口,而且对方并没有对我们的域名设置允许跨域,为了能够解决这一问题我们只能够通过后端请求避免跨域问题。

什么是multipart/form-data请求:

关于multipart/form-data详情查看:https://www.cnblogs.com/tylerdonet/p/5722858.html

Html上传图片按钮:


<div class="cover-hd">
<a href="javascript:;" class="a-uploadCustom">
<input type="file" id="Logoimg" onchange="OnchangeImage(this)" /></a>
</div>

使用ajax将图片文件流和相关参数传递到后端进行拼接:

注意:因为我这里调用第三方接口需要传递(appid应用程序唯一标识,random随机数,和sign签名)

<script type="text/javascript">//后端图片上传function OnchangeImage(obj) {var formData = new FormData();var files = $(obj).prop('files'); //获取到文件列表console.log(files[0]);formData.append("imgType", 1);formData.append("appId","你需要传递的参数");formData.append("random", "你需要传递的参数");formData.append("file", files[0]);//图片文件流formData.append("sign", "你需要传递的参数");console.log(formData);jQuery.support.cors = true;$.ajax({async: true,contentType: false, //头部请求内容格式dataType: 'json',type: 'post',data:formData,// 告诉jQuery不要去处理发送的数据processData: false,url: "@Url.Action("ImageUpload", "MtVirtualStore")",//后端接收图片接口success: function(data) {//后端Httpclient请求成功后返回过来的结果console.log(data);}});}
</script>

后端接收图片和参数,并将图片文件流转化为图片字节类型数据:


//接收前端图片文件信息
[HttpPost]
public JsonResult ImageUpload(FormContext context)
{
HttpPostedFileBase fileData = Request.Files[0];
string appId=Request["appId"];
string random=Request["random"];
string sign=Request["sign"];
string imgType=Request["imgType"];
if (fileData != null)
{
try{
string fileName = Path.GetFileName(fileData.FileName);//原始文件名称
byte[] byteFileData = ReadFileBytes(fileData);//文件流转为字节流var resultContext =HttpClientPostUpload(byteFileData,appId,random,sign,imgType, fileName);return Json(new { code = 1, list = resultContext,msg="上传成功~"});
}
catch (Exception ex)
{
return Json(new { code = 0, msg = ex.Message });
}
}
else
{
return Json(new { code = 0, msg = "图片上传失败,请稍后再试~" });
}
}//文件流转化为字节
/// <summary>
/// 文件流类型转化字节类型
/// </summary>
/// <param name="fileData">文件流数据</param>
/// <returns></returns>
private byte[] ReadFileBytes(HttpPostedFileBase fileData)
{
byte[] data;
using (Stream inputStream = fileData.InputStream)
{
MemoryStream memoryStream = inputStream as MemoryStream;
if (memoryStream == null)
{
memoryStream = new MemoryStream();
inputStream.CopyTo(memoryStream);
}
data = memoryStream.ToArray();
}
return data;
}

重点,HttpClient拼接multipart/form-data形式参数post提交数据:

/// <summary>
/// 向目标地址提交图片文件参数数据
/// </summary>
/// <param name="bmpBytes">图片字节流</param>
/// <param name="appId">appid</param>
/// <param name="random">随机数</param> 
/// <param name="sign">签名</param>
/// <param name="imgType">上传图片类型</param>     
/// <param name="fileName">图片名称</param>
/// <returns></returns>
public string HttpClientPostUpload(byte [] bmpBytes, string appId, string random,string sign,string imgType,string fileName)
{
using (var client = new HttpClient())
{
List<ByteArrayContent> list = new List<ByteArrayContent>();var dataContent = new ByteArrayContent(Encoding.UTF8.GetBytes(appId));
dataContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")//内容处置标头
{
Name = "appId"
};
list.Add(dataContent);var dataContent2 = new ByteArrayContent(Encoding.UTF8.GetBytes(imgType));
dataContent2.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "imgType"
};
list.Add(dataContent2);var dataContent3 = new ByteArrayContent(Encoding.UTF8.GetBytes(random));
dataContent3.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "random"
};
list.Add(dataContent3);var dataContent4 = new ByteArrayContent(Encoding.UTF8.GetBytes(sign));
dataContent4.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "sign"
};
list.Add(dataContent4);var fileContent = new ByteArrayContent(bmpBytes);//填充图片字节
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name="file",
FileName=fileName
};
list.Add(fileContent);using (var content =new MultipartFormDataContent())
{
Action<List<ByteArrayContent>> act = (dataContents) =>
{//声明一个委托,该委托的作用就是将ByteArrayContent集合加入到MultipartFormDataContent中
foreach (var byteArrayContent in dataContents)
{
content.Add(byteArrayContent);
}
};act(list);//执行act
try
{
var result = client.PostAsync("https://xxxxxx.com/imageUpload/", content).Result;//post请求
return result.Content.ReadAsStringAsync().Result;
}
catch (Exception ex)
{
return ex.Message;
}}
}
}

使用Fiddler 4 抓包查看请求的参数:

因为我们没有办法看到我们所拼接成功后的multipark/form-data形式的数据,想要看到对应拼接的请求参数可以使用 Fiddler 4 抓包工具查看:

关于Fiddler 4抓包工具的使用可以阅读该篇博客:https://www.jianshu.com/p/55f7be58a7e4

抓包获取到的multipark/form-data形式的请求参数如下图:

图片

相关文章:

  • 【微服务篇】深入理解微服务注册中心与配置中心
  • 使用Spring的缓存抽象来集成不同的缓存提供者,如Ehcache、Redis等
  • 大数据面试专题 -- kafka
  • 算法提高篇基础算法第一章 - 贪心算法
  • 乡村数字化转型:科技赋能打造智慧农村新生态
  • JAVA面试大全之数据库篇
  • 无论PC还是Mac,都能畅快地使用移动硬盘 Mac使用NTFS移动硬盘不能读写
  • Mistral 7B v0.2 基础模型开源,大模型微调实践来了
  • Linux网络配置(超详细)
  • 本地项目上传到GitHub
  • leetcode283-Move Zeroes
  • vue实现相机拍摄,可录视频、拍照片、前置后置切换(简单小demo)
  • Redis的Hash数据结构中100万对field和value,field是自增时如何优化?优化Hash结构。
  • Git 核心知识
  • idea从零开发Android 安卓 (超详细)
  • 网络传输文件的问题
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [数据结构]链表的实现在PHP中
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2017前端实习生面试总结
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CSS盒模型深入
  • ERLANG 网工修炼笔记 ---- UDP
  • Java 网络编程(2):UDP 的使用
  • Java超时控制的实现
  • Java读取Properties文件的六种方法
  • React-生命周期杂记
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • Windows Containers 大冒险: 容器网络
  • 翻译:Hystrix - How To Use
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 和 || 运算
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 新版博客前端前瞻
  • Spring Batch JSON 支持
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (2)(2.10) LTM telemetry
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Unity3DUnity3D在android下调试
  • (转)关于多人操作数据的处理策略
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net专家(高海东的专栏)
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Mapper作用
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [C++]类和对象【下】
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [C和指针].(美)Kenneth.A.Reek(ED2000.COM)pdf