POST上传

/*----------------- 01 POST上传单个文件 -----------------*/

重点:1.单个文件上传(四个步骤) 2.设置请求体格式

{

为什么要上传文件:

- 以前很多服务器对上传文件的大小有限制,PHP 限制是 2M

- 目前很多服务器不仅不限制大小,而且鼓励上传多个文件!

- 云服务器的普及!

- 软件商希望获得更多的用户数据!

提示:abc 的目录是用来保存上传文件的,需要设置访问权限!

<1> 文件上传使用 POST 方法.

// 请求为可变请求

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 制定请求方法为 POST

request.HTTPMethod = @"POST";

<2> 设置请求头,告诉服务器请求体中的内容包含文件参数.

[request setValue:@"multipart/form-data; boundary=kBoundary" forHTTPHeaderField:@"Content-Type"];

<3> 设置请求体(注意:必须严格按照格式设置).

{

// 上边界

--boundary\r\n

Content-Disposition: form-data; name=userfile; filename=555\r\n

Content-Type: application/json\r\n\r\n

文件内容的二进制数据

// 下边界

\r\n--boundary--

注意1:请求体内容分为三个部分:

* 上边界部分,告诉服务器要做数据上传,包含了服务器的接收字段name=userfile,文件在服务器中保存的名称filename=555,以及上传文件的数据类型 application/json(需要严格按照字符串格式来设置)

* 上传文件的数据部分(二进制数据)

* 下边界部分,严格按照字符串格式来设置.

上边界部分和下边界部分的字符串,最后都要转换成二进制数据,和文件部分的二进制数据拼接在一起,作为请求体发送给服务器.

注意2:

* userfile => 负责上传文件脚本中的 字段名,开发的时候,可以咨询后端程序员

* filename => 将文件保存在服务器上的文件名称

* Content-Type: 客户端告诉服务器上传文件的文件类型

注意3:

* 每一行末尾需要有一定的 \r\n

* 提示:有些服务器可以直接使用 \n,但是新浪微博如果使用 \n 上传文件,服务器会返回“没有权限”的错误!

}

<4> 发送请求(用 NSURLConnection异步发送请求)

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

//

NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"%@",string);

}];

}

/*------------------------- 02 多文件上传 ------------------------*/

重点:1.掌握多文件上传的数据格式 2.学会封装多文件上传的方法

{

多文件上传和单文件上传的基本思路是一样的,唯一的区别在于对请求体的封装.

多文件的请求体部分格式1

{

// 第一个文件参数的上边界

\r\n--boundary\r\n

Content-Disposition: form-data; name=userfile[]; filename=美女\r\n

Content-Type:image/jpeg\r\n\r\n

上传文件的二进制数据部分

// 第一个文件参数的下边界

\r\n--boundary--

// 第二个文件参数的上边界

\r\n--boundary\r\n

Content-Disposition: form-data; name=userfile[]; filename=JSON\r\n

Content-Type:text/plain\r\n\r\n

上传文件的二进制数据部分

// 第二个文件参数的下边界

\r\n--boundary--

}

{

多文件上传的请求体格式2

// 上边界

// 第一个文件参数

\r\n--boundary\r\n

Content-Disposition: form-data; name=userfile[]; filename=美女\r\n

Content-Type:image/jpeg\r\n\r\n

上传文件的二进制数据部分

// 第二个文件参数

\r\n--boundary\r\n

Content-Disposition: form-data; name=userfile[]; filename=JSON\r\n

Content-Type:text/plain\r\n\r\n

上传文件的二进制数据部分

// 下边界

\r\n--boundary--

}

}

/*--------------------- 03 获取文件的 MIMEType ---------------------*/

重点: 能够获取文件的 MIMEType.

{

上传文件的时候,需要告诉服务器文件类型(即Content-Type),这时,需要获取文件的 MIMEType.

获取文件的 MIMEType 方法:加载文件时,通过 response 获得

{

NSURLRequest *request = [NSURLRequest requestWithURL:url];

NSURLResponse *response = nil;

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL];

NSLog(@"%@",response.MIMEType);

}

response.MIMEType 即为 Content-Type 的类型.

如果不想告诉服务器具体的文件类型,可以使用这个 Content-Type : application/octet-stream(8进制流)

常见的 Content-Type 类型:

{

- 大类型/小类型

- text/plain

- image/jpg

- image/png

- image/gif

- text/html

- application/json

}

}

/*------------------- 04 多文件 + 普通文本上传 -----------------------*/

重点: 学会拼接上传文件数据.

{

* 有些服务器可以在上传文件的同时,提交一些文本内容给服务器

* 典型应用:

<1>新浪微博: 上传图片的同时,发送一条微博信息!

<2>购物评论: 购买商品之后发表评论的时候图片+评论内容!

多文件上传的数据格式3

{

Content-Type: multipart/form-data; boundary=boundary

// ------ 以下内容,是提供给服务器的二进制数据格式

--boundary\r\n

Content-Disposition: form-data; name="userfile[]"; filename="aaa.txt"\r\n

Content-Type: application/octet-stream\r\n\r\n

文件二进制数据

\r\n

--boundary\r\n

Content-Disposition: form-data; name="userfile[]"; filename="aaa副本.txt"\r\n

Content-Type: application/octet-stream\r\n\r\n

文件二进制数据

\r\n

--boundary\r\n

// username 是脚本文件接收参数的名称

Content-Disposition: form-data; name="username"\r\n\r\n

普通文本二进制数据

\r\n

--boundary--

// ------

以上部分,是发送给服务器的二进制数据的组成格式(示例)

}

如果在 iOS 中,要实现POST上传文件,需要按照上述格式,拼接数据!

因为:格式是 W3C 指定的标准格式,苹果没有做任何封装!其他语言,都做了封装!

以上三种数据拼接格式,需要大家了解并且能够自己会拼接一种!

"第三方框架做文件上传:

- AFN 能够同时实现上传"一个文件",有些格式的文件,用 AFN 无法上传!

- ASI 能够同时实现上传多个文件,MRC的,2012年就停止更新了,设计的目标平台, iOS 2.0/iOS 3.0 !

}

/*---------------------- 05 RESTful设计风格 ----------------------*/

重点: 了解RESTful设计风格

{

为了简化开发流程,使开发更加直观,解读更加容易,现在有一种非常流行的程序设计风格---->RESTful设计风格

RESTful设计风格:

主要用于后端开发,主要的表现形式为使用同一个 URL,不同的 HTTP 访问方法,表达不同的语义.

{

示例: http:/\/\www.xxx.com/product/123

-GET http:/\/\www.xxx.com/product/123  语义:从服务器"获取"产品ID 为123的产品信息.

-POST http:/\/\www.xxx.com/product/123  语义:在服务器"新增"产品ID 为123的产品信息.

* 提交二进制数据,需要提交一个 JSON 格式的二进制数据,后端程序员可以直接反序列化,得到 JSON 中得字典信息.

* POST JSON

-PUT http:/\/\www.xxx.com/product/123  语义:在服务器"修改"产品ID 为123的产品信息.

-DELETE http:/\/\www.xxx.com/product/123  语义:从服务器"删除"产品ID 为123的产品信息.

RESTful设计风格目前在国际上非常流行,国内也逐渐开始普及.

作为前端程序员,只需要知道有这种设计风格就可以.

}

}

/*-------------------- 06 AFN 上传文件 ---------------------*/

重点: 掌握 AFN 上传文件的方法

{   

 // 1. 创建管理者

    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];       

 // 2. 发送请求  

  [mgr POST:@"http://localhost/upload/upload.php" parameters:nil constructingBodyWithBlock:^(idformData) {

// formData :设置上传文件所需要的参数,两种上传方法:

// <1> 通过本地文件的 url 上传

{

NSString *fromFile = @"/Users/likaining/Desktop/meinv.jpg";

NSURL *url = [NSURL URLWithString:@"file:///Users/likaining/Desktop/meinv.jpg"];

// url :需要上传文件的文件路径

// name :服务器接收的文件名.

// fileName: 文件在服务器中保存的名字

// mimeType : 文件类型

[formData appendPartWithFileURL:url name:@"userfile" fileName:@"meinv" mimeType:@"image/jpg" error:NULL];

}

// <2> 通过文件的 二进制数据 上传

{

NSData *data = [NSData dataWithContentsOfFile:zipFile];

[formData appendPartWithFileData:data name:@"userfile" fileName:@"meinv.zip" mimeType:@"gzip"];

}

} success:^(AFHTTPRequestOperation *operation, id responseObject) {

// 上传成功之后的回调

NSLog(@"%@",responseObject);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

//  上传失败之后的回调

NSLog(@"失败");

}];

}

/*--------------------- 07 监测网络状态 ---------------------*/

重点: 1.AFN 监测网络状态  2.了解 Reachability 监测网络状态

{

1. AFN 监测网络状态

{

// 创建 网络状态管理者

AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];

// 监测网络状态的改变

[mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

// 当网络状态发生改变的时候调用这个block

switch (status) {

case AFNetworkReachabilityStatusReachableViaWiFi:

NSLog(@"WIFI网络");

break;

case AFNetworkReachabilityStatusReachableViaWWAN:

NSLog(@"蜂窝网络");

break;

case AFNetworkReachabilityStatusNotReachable:

NSLog(@"没有网络");

break;

case AFNetworkReachabilityStatusUnknown:

NSLog(@"未知网络");

break;

default:

break;

}

}];

// 开始监控

[mgr startMonitoring];

}

2.Reachability 监测网络状态

{

// 注册通知观察者,网络状态改变时,接收通知!

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(InternetStatusChanged) name:kReachabilityChangedNotification object:nil];

// 控制器销毁时,移除通知观察者.

-(void)dealloc

{

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

// 根据当前网络状态,做出不同的响应.

- (void)InternetStatusChanged

{

NSLog(@"网络状态改变了");

if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == ReachableViaWiFi) {

NSLog(@"Wifi 网络");

}

if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWWAN) {

NSLog(@"蜂窝移动网络");

}

if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable)

{

NSLog(@"没有网络");

}

}

// 创建 Reachability 对象,开始监测网络状态的改变

- (void)MonitorInternetStatus

{

Reachability *CZReachability = [Reachability reachabilityForInternetConnection];

[CZReachability startNotifier];

self.reachability = CZReachability;

}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

[self MonitorInternetStatus];

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容