天天看点

童鞋,[HttpClient发送文件] 的技术实践请查收

前几天有个童鞋在群里面问:怎么使用HttpClient发送文件?

之前我写了一个ABP上传文件,主要体现的是服务端,上传文件的动作是由前端小姐姐完成的, 我还真没有用HttpClient编程方式发送过文件。

不过想来,Web协议都是一样的,类比前端发送文件,httpclient按照<code>multipart/form-data</code>媒体类型应该也是可以发送的。

花一个钟头阅读了MDN Web协议,写成了HttpClient发送文件的实例, 看官自取。

我们跟随常见的表单上传文件思路来实现HttpClinet上传文件。

multipart/form-data是一种多部分的文档格式,每部分由边界线(一个由'--'开始的字符串)划分, 也是一种请求的媒体类型MIME

如下面的表单, 有三个待提交input表单字段

Check

Send the file

选中文件,点击[Send the file]按钮,提交表单,会发出如下请求

请观察由<code>boundary</code>划分的每个表单域和值, 其中<code>myFile</code>是一个文件表单域, 多一个<code>Content-Type</code>类型。

以上就是常规的Html表单上传文件的协议分析,回到本文主题, 这次会使用HttpClient编码形式发送只含有一个文件表单域的请求 (依旧利用的<code>multipart/form-data</code>媒体类型), 这也是下文的实现思路。

下面是httpclient向<code>localhost:5000/upload</code>地址上传文件, 服务器返回图片的base64编码字符串。

请注意,我使用一个随机的GUID做为每个表单域的划分边界,这里我向MultipartFormDataContent只插入了一个文件表单阈值,这样就做到了HttpClient发送文件。

文件表单域值: <code>{ byteArrayContent, "uploadedFile", "\"001ggg.png\""}</code> 中的参数2: 字段名称很重要,要与下面服务端的参数匹配。

上传文件的代码在 《》一文已经体现,本次截取接收文件上传的核心代码

码甲哥从不打诳语,启动客户端/服务端

成熟的技术必须有成熟的调试和监测手段!

每当做web开发出现阻塞的时候,我就掏出web利器: Fiddler。

跟着Fiddler去倒腾吧。

对常规html表单上传文件,做源码级分析。

根据分析结果,HttpClient使用同样的姿势发送文件: 使用<code>multipart/form-data</code>(多部分表单媒体类型)发起上传请求。

本文来自博客园,作者:{有态度的马甲},转载请注明原文链接:https://www.cnblogs.com/JulianHuang/p/15697845.html

欢迎关注我的原创技术、职场公众号, 加好友谈天说地,一起进化

童鞋,[HttpClient发送文件] 的技术实践请查收