iOS 利用系统原生 NSURLConnection POST 实现文件图片上传

今天开始做头像上传模块,原本想偷懒用AFN第三方去做图片上传,可是不知道是因为参数还是后台,老是上传失败。无法只能自己写个很 Low的图片上传代码了,吐槽一下:兼职的后台还没有接口说明只有一个PostMan 测试插件的导出文件,他还经常不在线😡😡😡....苦逼的自己写吧。

如何上传那

根本没接触过啊?怎么办只能通过程序员的两件神器 google百度 通过一番痛苦的搜寻。

  1. 文件上传使用的时POST请求,通常把要上传的数据保存在请求体中,将图片编码到POST请求体(body)中,通过请求数据一起发送到服务器上。
  2. 在iOS开发中,图片上传的请求体非常难写,格式要求非常严格,出一点错误都会造成上传失败,或请求数据失败。
  3. 重要事情说三遍: 格式要求非常严格、格式要求非常严格、格式要求非常严格

下面我们先看一下格式:

文件上传请求数据格式.png

-- 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].

code.png

补充:

一定要检查好 结束语 \r\n有没有添加好,因为这个折腾了一下午😭😭😭

部分文化的MIMEType :


数据格式.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容