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 ...
随机推荐
- Java对象校验框架之Oval
只要有接口,就会有参数的校验,目前开源的校验框架已经非常多了,不过不得不提一下Oval.OVal 是一个可扩展的Java对象数据验证框架,验证的规则可以通过配置文件.Annotation.POJO ...
- SQL中的模糊查询
写个标题先.先来一篇大神的文章:http://www.cnblogs.com/GT_Andy/archive/2009/12/25/1921914.html 练习代码如下: 1.百分号:% 表示任 ...
- GridView中的荧光棒效果
使用 ASP.NET中的GridView控件的时候会遇到这个效果,当时觉得很神奇,其实就是两句代码的事儿,可是时间长了,有点儿忘了,今天练习一下, 顺便把删除的时候弹出js中的confirm对话框也写 ...
- 【面试虐菜】—— Jboss调优
吐血整理了以前Jboss以及JVM在生产环境下的调优参数,各种不同的案例,都是来自网友杜撰.整合后,希望对广大使用jboss作为生产应用服务器的朋友有所帮助. JBOSS参数调优 配置deploy/j ...
- JNI-入门之二
Android中JNI编程的那些事儿 首先说明,Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++——即通过JNI的方式来使用本地(Na ...
- c/c++常用代码--清空目录
#pragma once #include <io.h>#include <stdio.h>#include <string>#include <direct ...
- windows下设置socket的connect超时
SOCKET Open(const char* strIP, UINT nPort, int nTimeOut) { SOCKET sockfd = NULL; ...
- Linux 系统 网络配置
Linux 系统 网络配置 配置Linux系统网络的方法有几种,这里介绍本人常用的两种. 第一种:使用命令ifconfig配置,具体用法:Ipconfig ethx x.x.x.x net ...
- 分析 "End" "Unload Me" "Exit Sub" 之间的区别与联系
之前就想过这个问题,这么熟悉的几个东西居然对他们分析的不是很透彻. “End” 跟 “Unload Me” 在敲程序 的时候经常敲到,“exit sub” 更是熟悉,下面,解析: End ...
- WebApi参数传递总结
在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流. 举例子说明: 1. 请求地址:/?id=123&name=bob 服务端方法: void Ac ...