原文地址为: iOS通过http post上传图片, 文件等

在http网络请求中,post没有请求长度的限制,因为post把数据放在了body中,而不是像Get一样放在了浏览器的地址栏中(可以这么理解),
所以相对安全。
POST有两种方式
第一种直接把数据放在body中,用contentType来区分类型是text还是json或者是别的什么数据。这个最简单,不做赘述。

第二种是表单的形式,通过boundaries来区分放置的是那些数据,很像一个字典,用K,V放置对象。

一般我都是使用ASIHttp的第三方库, 里面有个ASIFormDataReqest, 模拟Form表单提交, 其提交格式于Header会自动识别:

没有文件时: application/x-www-form-urlencoded

有文件时:multipart/form-data

另外大家可以通过下面这个代码例子,看 ASIHTTP 比传统的 post 方法的方便之处

NSMutableURLRequest 传统post用法
    NSString *post = @"这里放要传递的参数";  
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];  
    
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];  
    
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];  
    [request setURL:[NSURL URLWithString:@"请求地址"]];  
    [request setHTTPMethod:@"POST"];  
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    //[request addValue:@"gzip" forHTTPHeaderField:@"Accepts-Encoding"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];  
    [request setHTTPBody:postData];

NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self];  
    
    if (conn)    
    {  
        receivedbData = [[NSMutableData data] retain];  
    }    
    else    
    {  
        // inform the user that the download could not be made  
    }

ASIHTTP 方法

NSURL *url = [NSURL URLWithString:@"请求地址"];
//ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
ASIFormDataRequest *request=[ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"值" forKey:@"参数1"];
[request setPostValue:@"值" forKey:@"参数2"];

[request start];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
NSLog(response);
}
相比之下,ASIHTTP 的确省了很多代码.

2. 使用传统的表单Http post上传图片的方法详解如下:

由于iOS无法通过html表单来上传图片,因此想要上传图片,必须实现http请求,而不能像其他语言那样通过html表单的post就能上传。

上传图片的http post请求的格式是这样的:

Java代码  
  1. Content-type: multipart/form-data, boundary=AaB03x
  2. --AaB03x
  3. content-disposition: form-data; name="field1"
  4. Hello Boris!
  5. --AaB03x
  6. content-disposition: form-data; name="pic"; filename="boris.png"
  7. Content-Type: image/png
  8. ... contents of boris.png ...
  9. --AaB03x--

第一行是指定了http post请求的编码方式为multipart/form-data(上传文件必须用这个)。 
boundary=AaB03x说明了AaB03x为分界线。比如 --AaB03x 就是一个分界线的意思

content-disposition: form-data; name="field1"

Hello Boris!

这句话声明了请求中的一个字段的名称,如field1  以及字段的值,如Hello Boris! 
这里类似form表单中的<input name="field1" type="text" value="Hello Boris!"/> 
中间的空行是必须的。

不同的字段之间用分界线分开,分界线需要单独一行,如 --AaB03x--

分界线的下一行,是下一个字段

content-disposition: form-data; name="pic"; filename="boris.png" 
Content-Type: image/png

... contents of boris.png ... 
--AaB03x--

这里声明了变量pic,也就是我们要传的文件,上传文件的时候需要在后边指定file name:filename="boris.png" 
并且需要在下一行指定文件的格式:Content-Type: image/png

... contents of boris.png ...  这里是boris.png的二进制内容,如 <89504e47 0d0a1a0a 0000000d 49484452 000000b4 000000b4 08020000 00b2af91 65000020 00494441 5478012c dd79b724 6b7616f6 8c888c88 8c9c8733 55ddb1d5 6a0db486 06218401 ......

在http post请求的结尾,需要有一个分界线,但是是前后都有--的:--AaB03x--

以上的这些格式,是http的规范,每个空行,空格都是必须的。 
参考: http://www.ietf.org/rfc/rfc1867.txt

下边是iOS的实现代码:

C代码  
  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. }

ASI详细用法: http://blog.sina.com.cn/s/blog_64668ff001012b9c.html 参考: http://blog.csdn.net/long458/article/details/11798471

转载请注明本文地址: iOS通过http post上传图片, 文件等

iOS通过http post上传图片, 文件等相关推荐

  1. ssm上传图片文件到ftp(图片压缩处理)

    ##ssm上传图片文件到ftp(图片压缩处理) ## 开发工具 Eclipse 1.引入jar包 jar包下载地址:阿里中央仓库 2.配置spring-mvc.xml,添加以下代码 <bean ...

  2. XamarinSQLite教程Xamarin.iOS项目中打开数据库文件

    XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...

  3. XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件

    XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件 开发者可以在指定的路径中找到复制的数据库文件,具体的操作步骤如下: (1)单击Mac电脑中Finder菜单中的"前 ...

  4. 【OkHttp】OkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  5. ios开发证书,描述文件,bundle ID的关系

    http://www.jianshu.com/p/21ebca8cadf6 关键词有:个人开发者账号,企业开发者账号,bundle ID,开发证书,发布证书(又叫"生产证书"),开 ...

  6. IOS开发基础之解压缩文件技术

    IOS开发基础之解压缩文件技术 这里我们使用的第三方框架SSZipArchive,第三方依赖libz.tbd 库 ,基于C语言的,加入libz.tbd框架支持. 服务器我们选择是Java Web 的T ...

  7. ios开发之plist 的文件的读写以及沙盒容器路径打印

    ios开发之plist 的文件的读写以及沙盒容器路径打印 核心代码在这里 // // ViewController.m // 21-plist存储和沙盒路径 // // Created by 鲁军 o ...

  8. ios开发之使用多文件上传的简单封装最原始的

    ios开发之使用多文件上传的简单封装最原始的 // // ViewController.m // 18-上传多个文件 // // Created by 鲁军 on 2021/2/13. //#impo ...

  9. IOS开发基础之单文件上传基础最原始的方式

    IOS开发基础之单文件上传基础最原始的方式 info.plist 加入一行代码 <key>NSAppTransportSecurity</key><dict>< ...

最新文章

  1. R语言使用ggplot2包使用geom_density()函数绘制分组密度图(自定义调色板填充色、brewer调色板填充、灰度比例填充)实战(density plot)
  2. 前端资源系列(2)-SublimeText快捷键大全
  3. 一个WEB***的处理过程
  4. 【CV论文阅读】 Fast RCNN + SGD笔记
  5. 对Servlet容器的补充
  6. 直接插入排序比较次数_程序员必须要会的直接插入排序算法
  7. layui select 修改_layui怎么修改select的值?
  8. IOS UITextField
  9. 2022年计算机软件水平考试网络管理员(初级)练习题及答案
  10. Appkey is not configured or configured incorrectly
  11. 如何快速增长支付宝会员成长值
  12. wireshark使用Lua解析带有固定头和长度
  13. 图片分析——现代家居风水学[图文]居家必然之奇术
  14. 【Java学习笔记】(二)Java平台和Java虚拟机
  15. 机器学习--似然函数详解
  16. 魅蓝5s的android系统版本,魅蓝5s(全网通)
  17. 【工业机器人】两分钟读懂工业机器人的设计过程
  18. 泡泡机器人原创专栏-Cartographer】Cartographer理论及实现浅析
  19. 单词数据库 mysql_英语单词数据库 mysql
  20. 数据库学习-连接/join

热门文章

  1. 西安交通大学建立人工智能实验室
  2. 13年电赛综合测评——三角波
  3. html怎么设置联网,已连接(不可上网)怎么办?
  4. 【云原生】K8S--负载均衡详细介绍;什么是K8S的负载均衡?
  5. 拨号上网变成WiFi热点
  6. 【实验作业】微处理器原理与应用 CPUHomework2.1【二进制 原码 反码 补码 数制转换 典型例题】
  7. ③ESP8266 开发学习笔记_By_GYC 【虚拟机Ubuntu系统的安装】
  8. android开源框架(转)
  9. 商业承兑汇票贴现率是多少
  10. 关于解决google.com搜索跳转到google.com.hk的问题的解决方法