IOS图片上传功能实现总结

IOS图片上传主要分两种方式实现,一个是将图片信息以表单的形式上传,一种是将图片以JSON的格式上传。

首先要讲的是以这两个方式上传的一个比较明显的区别就是HTTP Header是如何标记的,以表单的形式上传时HTTP Header应该设置为multipart/form-data,以JSON格式上传时HTTP Header应该设置为application/json。

  1. Content-Type: multipart/form-data; boundary=${bound}
  1. Content-Type: application/json

了解了这些那我们在IOS项目中应该如何运用他们呢?

一、表单上传图片

  1. //分界线的标识符
  2. NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
  3. //根据url初始化request
  4. NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
  5. cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
  6. timeoutInterval:10];
  7. //分界线 --AaB03x
  8. NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
  9. //结束符 AaB03x--
  10. NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
  11. //要上传的图片
  12. UIImage *image=[params objectForKey:@"pic"];
  13. //得到图片的data
  14. NSData* data = UIImagePNGRepresentation(image);
  15. //http body的字符串
  16. NSMutableString *body=[[NSMutableString alloc]init];
  17. //参数的集合的所有key的集合
  18. NSArray *keys= [params allKeys];
  19. //遍历keys
  20. for(int i=0;i<[keys count];i++)
  21. {
  22. //得到当前key
  23. NSString *key=[keys objectAtIndex:i];
  24. //如果key不是pic,说明value是字符类型,比如name:Boris
  25. if(![key isEqualToString:@"pic"])
  26. {
  27. //添加分界线,换行
  28. [body appendFormat:@"%@\r\n",MPboundary];
  29. //添加字段名称,换2行
  30. [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
  31. //添加字段的值
  32. [body appendFormat:@"%@\r\n",[params objectForKey:key]];
  33. }
  34. }
  35. ////添加分界线,换行
  36. [body appendFormat:@"%@\r\n",MPboundary];
  37. //声明pic字段,文件名为boris.png
  38. [body appendFormat:@"Content-Disposition: form-data; name=\"pic\"; filename=\"boris.png\"\r\n"];
  39. //声明上传文件的格式
  40. [body appendFormat:@"Content-Type: image/png\r\n\r\n"];
  41. //声明结束符:--AaB03x--
  42. NSString *end=[[NSString alloc]initWithFormat:@"\r\n%@",endMPboundary];
  43. //声明myRequestData,用来放入http body
  44. NSMutableData *myRequestData=[NSMutableData data];
  45. //将body字符串转化为UTF8格式的二进制
  46. [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
  47. //将image的data加入
  48. [myRequestData appendData:data];
  49. //加入结束符--AaB03x--
  50. [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];
  51. //设置HTTPHeader中Content-Type的值
  52. NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
  53. //设置HTTPHeader
  54. [request setValue:content forHTTPHeaderField:@"Content-Type"];
  55. //设置Content-Length
  56. [request setValue:[NSString stringWithFormat:@"%d", [myRequestData length]] forHTTPHeaderField:@"Content-Length"];
  57. //设置http body
  58. [request setHTTPBody:myRequestData];
  59. //http method
  60. [request setHTTPMethod:@"POST"];
  61. //建立连接,设置代理
  62. NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
  63. //设置接受response的data
  64. if (conn) {
  65. mResponseData = [[NSMutableData data] retain];
  66. }

二、JSON上传图片

    1. //根据url初始化request
    2. NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
    3. cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
    4. timeoutInterval:10];
    5. //要上传的图片
    6. UIImage *image=[params objectForKey:@"pic"];
    7. //得到图片的data
    8. NSData* data = UIImagePNGRepresentation(image);
    9. //base64编码
    10. NSString *photoStr = [data base64Encoding];
    11. //参数字典
    12. NSDictionary *params = [[NSDictionary alloc] init];
    13. [params setObject:@{@"avatar": photoStr} forKey:@"profile"];
    14. NSData *myRequestData  = [NSMutableData dataWithData:[NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil]];
    15. //设置http header
    16. [request.request setValue:@"application/json" forHTTPHeaderField:@"Content-type"];
    17. [request.request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    18. //设置http body
    19. [request setHTTPBody:myRequestData];
    20. //http method
    21. [request setHTTPMethod:@"POST"];
    22. //建立连接,设置代理
    23. NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    24. //设置接受response的data
    25. if (conn) {
    26. mResponseData = [[NSMutableData data] retain];
    27. }

IOS开发--上传图片的更多相关文章

  1. iOS开发通过AFNetworking上传图片到服务器

    iOS开发通过AFNetworking上传图片到服务器 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager. ...

  2. iOS开发系列--App扩展开发

    概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...

  3. iOS开发中常见问题集锦

    在iOS开发中,会出现各种各样的问题.今天,就把这些常见的问题以及各位大牛的解决方案汇总下,方便以后查阅: 常见错误: 1. linker command failed with exit code ...

  4. iOS开发-照片选择

    本来想做个注册登录的表单的,想想还是先做个简单的头像选择,一般情况下不管是内部管理系统还是面向公众的互联网公司,注册登录是免不了的,用户头像上传是免不了的,尤其是企业用户,上传了自己的图片才感觉自己买 ...

  5. iOS开发——高级篇——线程同步、线程依赖、线程组

    前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...

  6. iOS开发之结合asp.net webservice实现文件上传下载

    iOS开发中会经常用到文件上传下载的功能,这篇文件将介绍一下使用asp.net webservice实现文件上传下载. 首先,让我们看下文件下载. 这里我们下载cnblogs上的一个zip文件.使用N ...

  7. iOS开发系列--Swift语言

    概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...

  8. iOS开发系列--打造自己的“美图秀秀”

    --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...

  9. iOS开发之再探多线程编程:Grand Central Dispatch详解

    Swift3.0相关代码已在github上更新.之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread.操作队列以及GCD,介绍的不够深入.今天就以GCD为主题来全面的总结一下GCD ...

随机推荐

  1. CentOS 普通用户设置sudo权限

    1.先切换到root用户下,输入命令 su 2.添加sudo文件的写权限,命令是: chmod u+w /etc/sudoers 3.编辑sudoers文件 vi /etc/sudoers 找到 ro ...

  2. Linq to Entities

    首先要添加一个ADO.NET实体数据模型 添加一个Entities 对象,其用法和linqtosql类似例如: StudentInfoEntities2 entity = new StudentInf ...

  3. 管道和FIFO

    pipe 子进程从终端读取一个文件名, 通过管道将文件名传递给父进程 父进程收到文件名后, 读取文件内容并通过管道传递给子进程 子进程接收到文件内容并输出到终端 #include <stdio. ...

  4. synchronized关键字使用剖析

    synchronized关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C. D等)正在用这个方法,有的话要等正在使用synchroniz ...

  5. mdf与ldf文件如何还原到SQLserver数据库

    现在又如下两个文件 需要用这两个文件还原数据库 那么该怎么去还原呢? 首先在D盘目录下建立一个文件夹test,然后将上图中的文件粘贴到该文件夹中. 接着在数据库中执行如下代码: EXEC sp_att ...

  6. android studio安装插件

    1.File-Settings菜单

  7. (菜鸟要飞系列)一,基于Asp.Net MVC5的后台管理系统(前言)

    今天真是个郁闷的日子,因为老师两个星期前给我的一个任务,用递归算法将Oracle数据库中用户信息及权限显示在jquery-treeView上,网上虽然有大神写出了这类算法,但是不贴全部代码,真的很难跟 ...

  8. java 泛型通配符 extends, super

    引自:http://sharewind.iteye.com/blog/1622164 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 ...

  9. javascript基础之客户端事件驱动

    我们知道,面向对象发展起来后,“一夜之间”,几乎所有的语言都能基于对象了,JavaScript也是基于对象的语言.用户在浏览器上的行为称作“事件”,之后引发的一系列动作,比如弹窗啦,改变浏览器大小啦, ...

  10. Vbox下linux虚拟机根分区扩容

    前言 使用一段时间VBox中的linux后可能会显示根分区空间不足的情况,需要扩容. 通过查阅相关资料,VBox中linux扩容主要有两种办法:通过lvm扩容和通过gparted扩容 LVM条件:VB ...