
.NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
发布日期:2021-05-08 23:18:00
浏览次数:21
分类:博客文章
本文共 3636 字,大约阅读时间需要 12 分钟。
前言:
本次要讲的是使用.Net HttpClient拼接multipark/form-data形式post上传文件和相关参数,并接收到上传文件成功后返回过来的结果(图片地址,和是否成功)。可能有很多人会说用ajax不是就可以轻松的实现吗?的确是在不存在跨域问题的前提下使用ajax上传文件,接收返回结果是最佳的选择。无奈的是我们对接的是第三方的一个上传图片的接口,而且对方并没有对我们的域名设置允许跨域,为了能够解决这一问题我们只能够通过后端请求避免跨域问题。
什么是multipart/form-data请求:
关于multipart/form-data详情查看:
Html上传图片按钮:
使用ajax将图片文件流和相关参数传递到后端进行拼接:
注意:因为我这里调用第三方接口需要传递(appid应用程序唯一标识,random随机数,和sign签名)
后端接收图片和参数,并将图片文件流转化为图片字节类型数据:
//接收前端图片文件信息[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 = "图片上传失败,请稍后再试~" });}} //文件流转化为字节////// 文件流类型转化字节类型/// /// 文件流数据///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提交数据:
////// 向目标地址提交图片文件参数数据/// /// 图片字节流/// appid/// 随机数 /// 签名/// 上传图片类型 /// 图片名称///public string HttpClientPostUpload(byte [] bmpBytes, string appId, string random,,string sign,string imgType,string fileName){using (var client = new HttpClient()){List list = new List ();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);List list2 = new List ();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
> act = (dataContents) =>{//声明一个委托,该委托的作用就是将ByteArrayContent集合加入到MultipartFormDataContent中foreach (var byteArrayContent in dataContents){content.Add(byteArrayContent);}};act(list);//执行acttry{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抓包工具的使用可以阅读该篇博客:
抓包获取到的multipark/form-data形式的请求参数如下图:
总结:
写到最后才发现,原本只需要一个简单的请求就可以解决的问题因为跨域把这个问题变得如此繁琐,搞得真叫人蛋痛。这里我试过了很多种方式拼接multipark/form-data形式的请求参数,最后在坚持不懈的尝试下终于成功了。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月27日 08时01分53秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
悲观锁与乐观锁
2021-05-09
js new Date 创建时间默认是8点
2021-05-09
Python实现cmd命令连续执行
2021-05-09
罗马数字
2021-05-09
IO多路复用小故事
2021-05-09
纠错码简介
2021-05-09
码云 Pages 搭建
2021-05-09
《论可计算数及其在判定上的应用》简单理解
2021-05-09
浮点数运算丢失精度
2021-05-09
中国剩余定理证明过程
2021-05-09
kafka告警简单方案
2021-05-09
SpringMvc @Validated注解执行原理
2021-05-09
java多线程执行问题
2021-05-09
java接口的应用举例
2021-05-09