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. js根据IP取得天气

    <span id="weather"></span> <script> function weather(cityName) { var cha ...

  2. SqlServer ,storedprocedure操作

    USE [Role] GO /*Create a table*/ IF OBJECT_ID ('dbo.Users', 'U') IS NOT NULL DROP TABLE Users GO CRE ...

  3. pyQuery

    pyquery – PyQuery complete API 选择器基本支持jQuery用法 class pyquery.pyquery.PyQuery(*args, **kwargs) The ma ...

  4. 转学步园:jquery offset

    JQuery Offset实验与应用 我们有时候需要实现这样一种功能:点击一个按钮,然后在按钮的下方显示一个div.当按钮位于角落时,div的位置设定就需要计算,使div完全显示. 我打算使用offs ...

  5. matlab实现复合梯形法则

    复合梯形法则: function int_f = CompoundEchelon( f, a, b, m ) % input : f : function handler % a : the lowe ...

  6. 【学习总结】声明变量在@interface括号中与使用@property的区别

    方式一:直接在.h文件@interface中的大括号中声明. @interface Test : NSObject { NSString *str; // 私有变量 , 其他类无法访问,只能够该类内部 ...

  7. eclipse 下找不到或无法加载主类的解决办法[转]

    转自:http://blog.sina.com.cn/s/blog_7ebc46500101gtff.html 有时候 Eclipse 会发神经,好端端的 project 就这么编译不了了,连 Hel ...

  8. mac 搭建git服务器

      一.简单搭建,不提供复杂的权限管理: 远程建立git用户,并打开ssh服务:见http://www.cnblogs.com/whj198579/archive/2013/04/09/3009350 ...

  9. 【HDOJ】【3709】Balanced Bumber

    数位DP 题解:http://www.cnblogs.com/algorithms/archive/2012/09/02/2667637.html dfs的地方没太看懂……(也就那里是重点吧喂!)挖个 ...

  10. oracle 条件:1=1或1=0,动态添加条件

    看到where语句中有条件:where 1=1    和    1=2或1<>1 用途:     1=1:是为了添加条件时使用and并列其他条件时使用的(动态连接后续条件)     比如: ...