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. php实现图片加密解密,支持加盐

    一个简单的图片加解密函数 使用client跑,不要使用浏览器跑 qq845875470 ,技术交流 <?php /** * Created by hello. * User: qq 845875 ...

  2. jquery 清空表达内容

    function clearForm(objE) { $(objE).find(':input').each( function() { switch (this.type) { case 'pass ...

  3. SQL中的模糊查询

    写个标题先.先来一篇大神的文章:http://www.cnblogs.com/GT_Andy/archive/2009/12/25/1921914.html 练习代码如下: 1.百分号:%   表示任 ...

  4. WPF的UI布局(Layout)WPF读书笔记(第三天)

        WPF的布局元素有一下几个 Grid:网格.可以自定义行和列并且通过行列的数目.行高和列宽来调整控件的布局. StackPanel:格式面板.可将包含的元素在水平方向或者竖直方向排成一条线. ...

  5. Vim配置IDE开发环境

    我的vim IDE界面: 1.安装Vim和Vim基本插件首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可:lingd@ubuntu:~/arm$sudo apt-get instal ...

  6. 2016 系统设计第一期 (档案一)jQuery radio 取值赋值

    MVC代码: <div class="form-group"> <label for="Gender" class="col-sm- ...

  7. cocos2d下,优秀骨骼spine的换装思路

    语文老师说,文章要有个好开头!!! 最近正在引入spine骨骼代替dragon bone骨骼,既然要替代,那么原先在dragon bone上的一些额外需求,不管dragon bone上能不能实现,都应 ...

  8. mutable和volatile关键字

    1.mutable 在C++中,mutable是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其 ...

  9. ListView防止滑动变色的小技巧

    listview滑动时会变成白色,如果背景色不是白色的话可以通过设置setCacheColorHint(Color.TRANSPARENT);来避免变色,.对应的xml也可以进行设置.

  10. UVA 1175 Ladies' Choice 稳定婚姻问题

    题目链接: 题目 Ladies' Choice Time Limit: 6000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu 问题 ...