前言
最近在做一个博客的小项目,需要用到文件上传,HttpClient又被Android给弃用了,图片框架暂时还没学。只能使用HttpURLConnection来上传。折腾了好久,今天终于顺利地跟后台完成了对接。因此,写这篇博客梳理一下知识。
理论知识
背景
最早的HTTP POST是 不支持 文件上传的,给编程开发带来很多问题。但是在1995年,ietf出台了rfc1867,也就是《RFC 1867 -Form-based File Upload in HTML》,用以支持文件上传。所以Content-Type的类型扩充了multipart/form-data用以支持向服务器发送二进制数据。因此发送post请求时候,表单属性enctype共有二个值可选,这个属性管理的是表单的MIME编码:
- ①application/x-www-form-urlencoded( 注:不设置enctype属性时默认为①)
- ②multipart/form-data
POST的报文请求分析
使用浏览器进行post请求将会发送以下数据:
//我是请求头
POST /t2/upload.do HTTP/1.1
Accept-Charset: GBK,utf-8;
Connection: keep-alive
Content-Length: 60408
Content-Type:multipart/form-data; boundary=ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC //设置内容类型为表单类型,同时定义了boundary “界限标识”
Host: w.sohu.com
//这里开始请求体的地盘啦,第一条请求体的实体数据(字符串参数)
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC //这里是"--"+boundary
Content-Disposition: form-data;name="xxx" //name="xxx", xxx为要发送的参数名
Content-Type: text/plain; charset=UTF-8 //设置内容类型为text 编码格式为utf-8
Content-Transfer-Encoding: 8bit
//这里是一个空行(不可少)
116.361545 // 我勒个去(到这里[空行之后的一行]才能写上xxx的参数值)有点坑是吧,我也觉得
--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC //这一大串还是"--"+boundary
//第二条请求体的实体数据(图片文件上传)
Content-Dispos