IOS开发--上传图片
IOS图片上传功能实现总结
IOS图片上传主要分两种方式实现,一个是将图片信息以表单的形式上传,一种是将图片以JSON的格式上传。
首先要讲的是以这两个方式上传的一个比较明显的区别就是HTTP Header是如何标记的,以表单的形式上传时HTTP Header应该设置为multipart/form-data,以JSON格式上传时HTTP Header应该设置为application/json。
- Content-Type: multipart/form-data; boundary=${bound}
- Content-Type: application/json
了解了这些那我们在IOS项目中应该如何运用他们呢?
一、表单上传图片
- //分界线的标识符
- NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
- //根据url初始化request
- NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
- cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
- timeoutInterval:10];
- //分界线 --AaB03x
- NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
- //结束符 AaB03x--
- NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
- //要上传的图片
- UIImage *image=[params objectForKey:@"pic"];
- //得到图片的data
- NSData* data = UIImagePNGRepresentation(image);
- //http body的字符串
- NSMutableString *body=[[NSMutableString alloc]init];
- //参数的集合的所有key的集合
- NSArray *keys= [params allKeys];
- //遍历keys
- for(int i=0;i<[keys count];i++)
- {
- //得到当前key
- NSString *key=[keys objectAtIndex:i];
- //如果key不是pic,说明value是字符类型,比如name:Boris
- if(![key isEqualToString:@"pic"])
- {
- //添加分界线,换行
- [body appendFormat:@"%@\r\n",MPboundary];
- //添加字段名称,换2行
- [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
- //添加字段的值
- [body appendFormat:@"%@\r\n",[params objectForKey:key]];
- }
- }
- ////添加分界线,换行
- [body appendFormat:@"%@\r\n",MPboundary];
- //声明pic字段,文件名为boris.png
- [body appendFormat:@"Content-Disposition: form-data; name=\"pic\"; filename=\"boris.png\"\r\n"];
- //声明上传文件的格式
- [body appendFormat:@"Content-Type: image/png\r\n\r\n"];
- //声明结束符:--AaB03x--
- NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPboundary];
- //声明myRequestData,用来放入http body
- NSMutableData *myRequestData=[NSMutableData data];
- //将body字符串转化为UTF8格式的二进制
- [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
- //将image的data加入
- [myRequestData appendData:data];
- //加入结束符--AaB03x--
- [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
- //设置HTTPHeader中Content-Type的值
- NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
- //设置HTTPHeader
- [request setValue:content forHTTPHeaderField:@"Content-Type"];
- //设置Content-Length
- [request setValue:[NSString stringWithFormat:@"%d", [myRequestData length]] forHTTPHeaderField:@"Content-Length"];
- //设置http body
- [request setHTTPBody:myRequestData];
- //http method
- [request setHTTPMethod:@"POST"];
- //建立连接,设置代理
- NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
- //设置接受response的data
- if (conn) {
- mResponseData = [[NSMutableData data] retain];
- }
二、JSON上传图片
- //根据url初始化request
- NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
- cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
- timeoutInterval:10];
- //要上传的图片
- UIImage *image=[params objectForKey:@"pic"];
- //得到图片的data
- NSData* data = UIImagePNGRepresentation(image);
- //base64编码
- NSString *photoStr = [data base64Encoding];
- //参数字典
- NSDictionary *params = [[NSDictionary alloc] init];
- [params setObject:@{@"avatar": photoStr} forKey:@"profile"];
- NSData *myRequestData = [NSMutableData dataWithData:[NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil]];
- //设置http header
- [request.request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];
- [request.request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
- //设置http body
- [request setHTTPBody:myRequestData];
- //http method
- [request setHTTPMethod:@"POST"];
- //建立连接,设置代理
- NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
- //设置接受response的data
- if (conn) {
- mResponseData = [[NSMutableData data] retain];
- }
IOS开发--上传图片的更多相关文章
- iOS开发通过AFNetworking上传图片到服务器
iOS开发通过AFNetworking上传图片到服务器 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager. ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- iOS开发中常见问题集锦
在iOS开发中,会出现各种各样的问题.今天,就把这些常见的问题以及各位大牛的解决方案汇总下,方便以后查阅: 常见错误: 1. linker command failed with exit code ...
- iOS开发-照片选择
本来想做个注册登录的表单的,想想还是先做个简单的头像选择,一般情况下不管是内部管理系统还是面向公众的互联网公司,注册登录是免不了的,用户头像上传是免不了的,尤其是企业用户,上传了自己的图片才感觉自己买 ...
- iOS开发——高级篇——线程同步、线程依赖、线程组
前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...
- iOS开发之结合asp.net webservice实现文件上传下载
iOS开发中会经常用到文件上传下载的功能,这篇文件将介绍一下使用asp.net webservice实现文件上传下载. 首先,让我们看下文件下载. 这里我们下载cnblogs上的一个zip文件.使用N ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列--打造自己的“美图秀秀”
--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...
- iOS开发之再探多线程编程:Grand Central Dispatch详解
Swift3.0相关代码已在github上更新.之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread.操作队列以及GCD,介绍的不够深入.今天就以GCD为主题来全面的总结一下GCD ...
随机推荐
- PHP环境搭建(Windows8.1+IIS8.5+PHP5.6+PHPStorm)
第一次接触php是在2014-5月份左右,当时是自己的主攻方向是C#,对php比较排斥, 其中很多一部分原因,就是PHP的断点调试一直无法配置成功,用echo打印日志的方式排错,使得自己对php心生怨 ...
- Eclipse 代码提示功能设置。
1. 解决实例化时自动补全不必要的单词问题 2. 以MyEclipse 6.5重新配图 鉴 于网上的批评之声甚大,我只想说明我的想法:这样的增强代码提示,最终是用来辅助我们 ...
- asp.net 生成PDF方法
今天转博客园看到有人发表了一篇生成PFd的文章,准备自己也留一份准备以后用到的时候方便调用: 首先去itextsharp网站下载控件(https://sourceforge.net/projects/ ...
- hadoop集群默认配置和常用配置【转】
转自http://www.cnblogs.com/ggjucheng/archive/2012/04/17/2454590.html 获取默认配置 配置hadoop,主要是配置core-site.xm ...
- ASP.NET对HTML元素进行权限控制(一)
一个HTML页面有很多的元素比如<DIV>,<P>等.这些元素构成了HTML页面.在Web开发中权限控制是每个系统都要用到了.界面每个元素的权限也是需要控制的.比如一个查询用户 ...
- 管理口令(P):[INS-30001] ADMIN口令为空之Oracle安装
在安装oracle database11g 发行版的时候出现下面这个问题. 无论怎么输入密码都提示有问题,都输入得鬼火了!去百度了一下,果然有命名规则的 规则如下:小写字母+数字+大写字母
- 短小强悍的JavaScript异步调用库
对于博文 20行完成一个JavaScript模板引擎 的备受好评我感到很惊讶,并决定用此文章介绍使用我经常使用的另一个小巧实用的工具.我们知道,在浏览器中的 JavaScript 绝大部分的操作都是异 ...
- NP完全问题
1.概念 好算法:Edmonds与1975年提出:具有多项式时间(O(nk)的算法为好算法. P类问题:存在多项式时间算法的问题.如:货郎问题.调度问题.最大团问题.最大独立集问题.Steiner树问 ...
- 0x01第一个汇编程序
;将由text db 10,20,30,40定义的4个数相加,并输出其和. .386 ;指明指令集 .model flat,stdcall ;平坦模式,函数右边的参数先入栈 option cas ...
- Java程序员使用的20几个大数据工具
最近我问了很多Java开发人员关于最近12个月内他们使用的是什么大数据工具. 这是一个系列,主题为: 语言 web框架 应用服务器 SQL数据访问工具 SQL数据库 大数据 构建工具 云提供商 今天我 ...