AFNetworking实现POST上传文件——图片、.json、MP4,,,,,等各种类型。
2015-11-01 21:05
1036 查看
导入AFNetworking框架后,使用步骤如下:
第一步:获取上传网址。如下所示:NSString *url =@"http://127.0.0.1/post/upload.php";
第二步:新建AFHTTPRequestOperationManager对象,具体如下:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
第三步:开始上传。上传有两种方式:
第一种方式上传无法执行上传到服务器后的文件名。但是第二种方式可以指定上传到服务器后的文件名。具体实现如下:
[manager POST:urlparameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData>
formData) {
//要上传的图片路径
NSURL *fileUrl = [[NSBundlemainBundle]URLForResource:@"XXXX.png"withExtension:nil];
/*
上传方式一:
FileURL:
要上传的文件的url
name:上传到服务器,接受此图片的字段名。
这种方式,没有办法修改这个文件在服务器端的名字。
*/
// [formData appendPartWithFileURL:fileUrl name:@"userfile" error:NULL];
/**
上传方式二:
FileURL:要上传的文件的url
name:上传到服务器,接受这个图片的字段名
fileName:这个文件在服务器的名字。
mimeType:表示要上传的文件的类型。
mimeType的格式——大类/小类
JPG image/jpg
PNG image/png
JSON application/json
如果要上传别的文件类型,百度一下mimeType即可
mimeType参考手册文档的网址——>
http://www.w3school.com.cn/media/media_mimeref.asp */
[formData
appendPartWithFileURL:fileUrlname:@"userfile"fileName:@"咪咪图.png"mimeType:@"image/png"error:nil];
} success:^(AFHTTPRequestOperation *operation,id
responseObject) { //上传成功
} failure:^(AFHTTPRequestOperation *operation,NSError
*error) { //上传失败
}];
需要注意的是:上传方法中的name指在服务器接受此文件的字段名,双击打开本地服务器的后台的upload.php。如下:
新建工程,具体实现如下:
首先打开本地服务器,用火狐打开upload.php文件,复制网址即为上传的网址:
具体代码实现如下:
第二种方式上传图片后,打开本地服务器存放上传文件的文件夹如下:
AFN总结:
AFN小结:
功能:
- 对NSURLSession和NSURLConnection的封装
- 提供了反序列化的方法
- 提供了完善的错误处理机制
在网络开发中,最大变化的部分-->NSURLRequest
1、HTTP的方法:GET/POST/PUT/DELEGATE
2、请求体。
- 内容的类型 Content-Type POST上传
- 浏览器的类型
第一步:获取上传网址。如下所示:NSString *url =@"http://127.0.0.1/post/upload.php";
第二步:新建AFHTTPRequestOperationManager对象,具体如下:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManagermanager];
第三步:开始上传。上传有两种方式:
第一种方式上传无法执行上传到服务器后的文件名。但是第二种方式可以指定上传到服务器后的文件名。具体实现如下:
[manager POST:urlparameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData>
formData) {
//要上传的图片路径
NSURL *fileUrl = [[NSBundlemainBundle]URLForResource:@"XXXX.png"withExtension:nil];
/*
上传方式一:
FileURL:
要上传的文件的url
name:上传到服务器,接受此图片的字段名。
这种方式,没有办法修改这个文件在服务器端的名字。
*/
// [formData appendPartWithFileURL:fileUrl name:@"userfile" error:NULL];
/**
上传方式二:
FileURL:要上传的文件的url
name:上传到服务器,接受这个图片的字段名
fileName:这个文件在服务器的名字。
mimeType:表示要上传的文件的类型。
mimeType的格式——大类/小类
JPG image/jpg
PNG image/png
JSON application/json
如果要上传别的文件类型,百度一下mimeType即可
mimeType参考手册文档的网址——>
http://www.w3school.com.cn/media/media_mimeref.asp */
[formData
appendPartWithFileURL:fileUrlname:@"userfile"fileName:@"咪咪图.png"mimeType:@"image/png"error:nil];
} success:^(AFHTTPRequestOperation *operation,id
responseObject) { //上传成功
} failure:^(AFHTTPRequestOperation *operation,NSError
*error) { //上传失败
}];
需要注意的是:上传方法中的name指在服务器接受此文件的字段名,双击打开本地服务器的后台的upload.php。如下:
新建工程,具体实现如下:
首先打开本地服务器,用火狐打开upload.php文件,复制网址即为上传的网址:
具体代码实现如下:
<span style="font-size:18px;"><span style="font-size:18px;">// // ViewController.m // AFN的使用(需要重点掌握) // // Created by apple on 15/10/31. // Copyright (c) 2015年 LiuXun. All rights reserved. // #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () @end @implementation ViewController -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self postUpLoad]; } #pragma mark - 常规的方法 /** 1、没有URL,只需指定一个url字符串即可。 2、网络请求是异步,完成以后的回调代码块直接在主线程。 3、已经实现了反序列化。 4、如果get方法需要传递参数,可以使用字段的方式传递。程序员不需要关心url里面的格式。 5、POST方法,如果需要传递参数,也可以以字典的形式传递。 */ /**GET登录(一)*/ -(void)getLogin { NSString *urlStr = @"http://127.0.0.1/login.php?username=zhangsan&password=zhang"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // GET 方法 [manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@ %@", responseObject, [NSThread currentThread] ); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }]; } /**GET登录(二)*/ -(void)getLogin2 { NSString *urlStr = @"http://127.0.0.1/login.php"; NSDictionary *params = @{@"password":@"zhang", @"username":@"zhangsan"}; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:urlStr parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@ %@", responseObject, [NSThread currentThread] ); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }]; } /**POST登录*/ -(void)postLogin { NSString *urlStr = @"http://127.0.0.1/login.php"; NSDictionary *params = @{@"password":@"zhang", @"username":@"zhangsan"}; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // POST 方法 [manager POST:urlStr parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@ %@", responseObject, [NSThread currentThread] ); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }]; } -(void)getDemo { NSString *urlStr = @"http://127.0.0.1/videos.json"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // GET 方法 [manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { // 已经把反序列化完成的结果都直接返回了。可以直接更新UI。 NSLog(@"%@ %@", responseObject, [NSThread currentThread]); NSArray *array = responseObject; for (NSDictionary *dict in array) { NSLog(@"%@", dict[@"desc"]); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }]; NSLog(@"XXXXXX-------Finish"); } #pragma mark- XML解析 /** 请求的解析器 requestSerizalizer:设置请求的数据体或数据格式的。即发送给服务器数据的格式。 manager.requestSerializer = [AFHTTPRequestSerializer serializer]; AFHTTPRequestSerializer:二进制的数据格式(默认的)。默认请求的是二进制数据格式 AFJSONRequestSerializer:JSON AFPropertyListRequestSerializer:PList 响应的解析器(默认直接解析JSON) manager.responseSerializer = [AFJSONResponseSerializer serializer]; AFJSONResponseSerializer:JSON(默认格式,即如果不设置服务器返回数据的格式,默认返回的是JSON格式) AFJSONResponseSerializer:二进制数据,也可以返回二进制数据,一般在下载中使用。 AFXMLParserResponseSerializer:XML的解析器(SAX方式解析) AFImageResponseSerializer:IMG 也就是说服务器可以返回图片(一般不使用,因为只要牵涉图片的网络处理就只使用SDWebImage进行处理) */ -(void)getXML { NSString *urlStr = @"http://127.0.0.1/videos.xml"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 指定我们的响应的解析器是XML(NSXMLParser:)也就是需要SAX方式手动解析 manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; /* 假如我们想使用DOM进行解析,可以指定服务器返回数据的类型是二进制。 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; */ // GET 方法 [manager GET:urlStr parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { // 已经把反序列化完成的结果都直接返回了。可以直接更新UI。 NSLog(@"%@ %@", responseObject, [NSThread currentThread]); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error); }]; NSLog(@"XXXXXX-------Finish"); } #pragma mark - POST上传图片 -(void)postUpLoad { // url NSString *url = @"http://127.0.0.1/post/upload.php"; AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager POST:url parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 要上传的图片路径 NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"XXXX.png" withExtension:nil]; /* 上传方式一: FileURL: 要上传的文件的url name:上传到服务器,接受此图片的字段名。 这种方式,没有办法修改这个文件在服务器端的名字。 */ // [formData appendPartWithFileURL:fileUrl name:@"userfile" error:NULL]; /** 上传方式二: FileURL:要上传的文件的url name:上传到服务器,接受这个图片的字段名 fileName:这个文件在服务器的名字。 mimeType:表示要上传的文件的类型。 mimeType的格式—— 大类/小类 JPG image/jpg PNG image/png JSON application/json 如果要上传别的文件类型,百度一下mimeType即可 mimeType参考手册文档的网址——> http://www.w3school.com.cn/media/media_mimeref.asp */ [formData appendPartWithFileURL:fileUrl name:@"userfile" fileName:@"咪咪图.png" mimeType:@"image/png" error:nil]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { // 上传成功 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { //上传失败 }]; } @end</span></span>第一种方式上传图片后,打开本地服务器存放上传文件的文件夹如下:
第二种方式上传图片后,打开本地服务器存放上传文件的文件夹如下:
AFN总结:
AFN小结:
功能:
- 对NSURLSession和NSURLConnection的封装
- 提供了反序列化的方法
- 提供了完善的错误处理机制
在网络开发中,最大变化的部分-->NSURLRequest
1、HTTP的方法:GET/POST/PUT/DELEGATE
2、请求体。
- 内容的类型 Content-Type POST上传
- 浏览器的类型
相关文章推荐
- JavaScript高级程序设计之DOM之节点层次之Element类型第10.1.3讲
- JavaScript设计模式 Item 3 --封装
- JavaScript设计模式 Item 3 --封装
- 比较常用的替换所有指定文字的js代码
- JavaScript DOM对象控制HTML元素详解
- week9---11月4日 JS基础(二)
- jsp小结03 - 3个编译指令page、include、taglib
- javascript引擎工作原理
- javaScript练习(二):tab选项卡
- Jasmine-基于JavaScript的行为驱动单元测试框架简介
- 逻辑运算符 && || ! 的一些理解
- week9---11月3日 div 布局综合练习、JS基础
- jspsmartupload上传文件名中文乱码和超链接传递路径参数encodeURIComponent加解码
- JS学习实例:JavaScript时钟及Date对象学习总结
- JavaScript HTML DOM 事件
- Jsoup Element网页信息采集
- Canvas绘图-js
- js 开始时间与结束时间比较大小---->yyyy-MM-dd hh:mm:ss 字符串转换成时间戳
- 分页插件开发(1)--jstl自定义标签
- Javascript监督学习