今天开始做头像上传模块,原本想偷懒用AFN第三方去做图片上传,可是不知道是因为参数还是后台,老是上传失败。无法只能自己写个很 Low的图片上传代码了,吐槽一下:兼职的后台还没有接口说明只有一个PostMan 测试插件的导出文件,他还经常不在线😡😡😡....苦逼的自己写吧。
如何上传那
- 文件上传使用的时POST请求,通常把要上传的数据保存在请求体中,将图片编码到POST请求体(body)中,通过请求数据一起发送到服务器上。
- 在iOS开发中,图片上传的请求体非常难写,格式要求非常严格,出一点错误都会造成上传失败,或请求数据失败。
- 重要事情说三遍: 格式要求非常严格、格式要求非常严格、格式要求非常严格
下面我们先看一下格式:
-- Boundary+72D4CD655314C423
Content-Disposition: form-data; name="uploadFile"; filename="001.png"
Content-Type:image/png
Content-Transfer-Encoding: binary
*空一行*
... contents of boris.png ...
--Boundary+72D4CD655314C423--
这是一个不带其他任务参数,body中只有一张图就要这样写
参数解释
//分割符号,以"--"开头,后边是自定义的分割表示符
-- Boundary+72D4CD655314C423
//这里注明服务器接受图片的参数(服务器指定参数名称)及服务器上保存图片的文件名
Content-Disposition: form-data; name="file"; filename="001.png"
//图片类型png或者jpeg
Content-Type:image/png
//编码方式(PS:一直没弄懂)
Content-Transfer-Encoding: binary
// 这里空一行,必须不可少!!(我就犯错在这,弄了一下午,注意:空一行、空一行、空一行)
*空一行*
// 图片数据部分
... contents of boris.png ...
//分割符号右面以"--"结尾,表面结束
--Boundary+72D4CD655314C423--
如果有其他表单数据,如传用户ID等参数,也要写成以上格式:
-Boundary+72D4CD655314C423
Content-Disposition: form-data; name="userId"
*空一行*
254
--Boundary+72D4CD655314C423
Content-Disposition: form-data; name="shopId"
*空一行*
18718
具体参数含义与图片一致,一般这段会在图片上面,因此没有结尾符,如果没有其他数据了,那要加上结尾符。
Object - C 实现代码:
LSEncode#define LSEncode(str) [string dataUsingEncodeing:NSUTF8StringEncoding]
.
补充:
一定要检查好 结束语 \r\n
有没有添加好,因为这个折腾了一下午😭😭😭
部分文化的MIMEType :