iOS通过http post上传图片, 文件等
原文地址为: iOS通过http post上传图片, 文件等
所以相对安全。
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请求的格式是这样的:
- Content-type: multipart/form-data, boundary=AaB03x
- --AaB03x
- content-disposition: form-data; name="field1"
- Hello Boris!
- --AaB03x
- content-disposition: form-data; name="pic"; filename="boris.png"
- Content-Type: image/png
- ... contents of boris.png ...
- --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的实现代码:
- //分界线的标识符
- 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];
- }
ASI详细用法: http://blog.sina.com.cn/s/blog_64668ff001012b9c.html 参考: http://blog.csdn.net/long458/article/details/11798471
转载请注明本文地址: iOS通过http post上传图片, 文件等
iOS通过http post上传图片, 文件等相关推荐
- ssm上传图片文件到ftp(图片压缩处理)
##ssm上传图片文件到ftp(图片压缩处理) ## 开发工具 Eclipse 1.引入jar包 jar包下载地址:阿里中央仓库 2.配置spring-mvc.xml,添加以下代码 <bean ...
- XamarinSQLite教程Xamarin.iOS项目中打开数据库文件
XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...
- XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件
XamarinSQLite教程在Xamarin.iOS项目中定位数据库文件 开发者可以在指定的路径中找到复制的数据库文件,具体的操作步骤如下: (1)单击Mac电脑中Finder菜单中的"前 ...
- 【OkHttp】OkHttp 上传图片 ( 获取 SD 卡动态权限 | 跳转到相册界面选择图片 | 使用 OkHttp 上传图片文件 )
OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...
- ios开发证书,描述文件,bundle ID的关系
http://www.jianshu.com/p/21ebca8cadf6 关键词有:个人开发者账号,企业开发者账号,bundle ID,开发证书,发布证书(又叫"生产证书"),开 ...
- IOS开发基础之解压缩文件技术
IOS开发基础之解压缩文件技术 这里我们使用的第三方框架SSZipArchive,第三方依赖libz.tbd 库 ,基于C语言的,加入libz.tbd框架支持. 服务器我们选择是Java Web 的T ...
- ios开发之plist 的文件的读写以及沙盒容器路径打印
ios开发之plist 的文件的读写以及沙盒容器路径打印 核心代码在这里 // // ViewController.m // 21-plist存储和沙盒路径 // // Created by 鲁军 o ...
- ios开发之使用多文件上传的简单封装最原始的
ios开发之使用多文件上传的简单封装最原始的 // // ViewController.m // 18-上传多个文件 // // Created by 鲁军 on 2021/2/13. //#impo ...
- IOS开发基础之单文件上传基础最原始的方式
IOS开发基础之单文件上传基础最原始的方式 info.plist 加入一行代码 <key>NSAppTransportSecurity</key><dict>< ...
最新文章
- R语言使用ggplot2包使用geom_density()函数绘制分组密度图(自定义调色板填充色、brewer调色板填充、灰度比例填充)实战(density plot)
- 前端资源系列(2)-SublimeText快捷键大全
- 一个WEB***的处理过程
- 【CV论文阅读】 Fast RCNN + SGD笔记
- 对Servlet容器的补充
- 直接插入排序比较次数_程序员必须要会的直接插入排序算法
- layui select 修改_layui怎么修改select的值?
- IOS UITextField
- 2022年计算机软件水平考试网络管理员(初级)练习题及答案
- Appkey is not configured or configured incorrectly
- 如何快速增长支付宝会员成长值
- wireshark使用Lua解析带有固定头和长度
- 图片分析——现代家居风水学[图文]居家必然之奇术
- 【Java学习笔记】(二)Java平台和Java虚拟机
- 机器学习--似然函数详解
- 魅蓝5s的android系统版本,魅蓝5s(全网通)
- 【工业机器人】两分钟读懂工业机器人的设计过程
- 泡泡机器人原创专栏-Cartographer】Cartographer理论及实现浅析
- 单词数据库 mysql_英语单词数据库 mysql
- 数据库学习-连接/join
热门文章
- 西安交通大学建立人工智能实验室
- 13年电赛综合测评——三角波
- html怎么设置联网,已连接(不可上网)怎么办?
- 【云原生】K8S--负载均衡详细介绍;什么是K8S的负载均衡?
- 拨号上网变成WiFi热点
- 【实验作业】微处理器原理与应用 CPUHomework2.1【二进制 原码 反码 补码 数制转换 典型例题】
- ③ESP8266 开发学习笔记_By_GYC 【虚拟机Ubuntu系统的安装】
- android开源框架(转)
- 商业承兑汇票贴现率是多少
- 关于解决google.com搜索跳转到google.com.hk的问题的解决方法