0923-网络 文件上传
----------
1、SSZipArchive 压缩解压缩 文件
需要手动添加 libz动态库
[SSZipArchive unzipFileAtPath:location.path toDestination:caches]; [SSZipArchive createZipFileAtPath:location.path withContentsOfDirectory:images];
2、AFN代码 (相当于jquery.js的$.post $.get 只要会用就好 不用深究)
AFN 工作中经常用到 做文件上传 GET POST请求 ASI应付面试和旧项目 已经淘汰了
AFN 文件下载还是采用NSURLSession 自动放到沙盒 因为2个差不多
明天的内容 AFN 监控网络状态 取代 Reachability 监控网络连接使用的是wifi还是手机自带网络(3g/4g)
#import “AFNetworking.h"
AFN网络状态监听 取代Reachability
AFN GET POST代码
/** * 利用AFN发送一个GET请求,服务器返回的JSON数据 */ - (void)getJSON { // 1.创建一个请求操作管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; // 声明一下:服务器返回的是JSON数据 // mgr.responseSerializer = [AFJSONResponseSerializer serializer]; // responseObject的类型是NSDictionary或者NSArray // 2.请求参数 NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"username"] = @"哈哈哈"; params[@"pwd"] = @"123"; // 3.发送一个GET请求 NSString *url = @"http://localhost:8080/MJServer/login"; [mgr GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { // 请求成功的时候调用这个block NSLog(@"请求成功---%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // 请求失败的时候调用调用这个block NSLog(@"请求失败"); }]; }
AFN文件上传代码:图片上传
// // HMViewController.m #import "HMViewController.h" #import "AFNetworking.h" @interface HMViewController () <UINavigationControllerDelegate, UIImagePickerControllerDelegate,UIActionSheetDelegate> @property (weak, nonatomic) IBOutlet UIImageView *imageView; - (IBAction)upload; @end @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"请选择图片" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"拍照", @"相册", nil]; [sheet showInView:self.view.window]; } #pragma mark - UIActionSheet - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { UIImagePickerController *ipc = [[UIImagePickerController alloc] init]; // 设置代理 ipc.delegate = self; switch (buttonIndex) { case 0: { // 拍照 if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) return; ipc.sourceType = UIImagePickerControllerSourceTypeCamera; break; } case 1: { // 相册 if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) return; ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; break; } default: break; } // 显示控制器 [self presentViewController:ipc animated:YES completion:nil]; } #pragma mark - UIImagePickerControllerDelegate /** * 在选择完图片后调用 * * @param info 里面包含了图片信息 */ - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { // 销毁控制器 [picker dismissViewControllerAnimated:YES completion:nil]; // 获得图片 UIImage *image = info[UIImagePickerControllerOriginalImage]; // 显示图片 self.imageView.image = image; } - (void)upload1 { // 1.创建一个管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; // 2.封装参数(这个字典只能放非文件参数) NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"username"] = @"123"; params[@"age"] = @20; params[@"pwd"] = @"456"; params[@"height"] = @1.55; // 2.发送一个请求 NSString *url = @"http://localhost:8080/MJServer/upload"; [mgr POST:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 在发送请求之前会自动调用这个block // 需要在这个block中添加文件参数到formData中 /** FileURL : 需要上传的文件的URL路径 name : 服务器那边接收文件用的参数名 fileName : (告诉服务器)所上传文件的文件名 mimeType : 所上传文件的文件类型 */ NSURL *url = [[NSBundle mainBundle] URLForResource:@"itcast" withExtension:@"txt"]; [formData appendPartWithFileURL:url name:@"file" fileName:@"test.txt" mimeType:@"text/plain" error:nil]; /** FileData : 需要上传的文件的具体数据 name : 服务器那边接收文件用的参数名 fileName : (告诉服务器)所上传文件的文件名 mimeType : 所上传文件的文件类型 */ // UIImage *image = [UIImage imageNamed:@"minion_01"]; // NSData *fileData = UIImagePNGRepresentation(image); // [formData appendPartWithFileData:fileData name:@"file" fileName:@"haha.png" mimeType:@"image/png"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"上传成功"); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"上传失败"); }]; } - (IBAction)upload { if (self.imageView.image == nil) return; // 1.创建一个管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; // 2.封装参数(这个字典只能放非文件参数) NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"username"] = @"123"; params[@"age"] = @20; params[@"pwd"] = @"456"; params[@"height"] = @1.55; // 2.发送一个请求 NSString *url = @"http://192.168.15.172:8080/MJServer/upload"; [mgr POST:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { NSData *fileData = UIImageJPEGRepresentation(self.imageView.image, 1.0); [formData appendPartWithFileData:fileData name:@"file" fileName:@"haha.jpg" mimeType:@"image/jpeg"]; // 不是用这个方法来设置文件参数 // [formData appendPartWithFormData:fileData name:@"file"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"上传成功"); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"上传失败"); }]; // 文件下载,文件比较大,断点续传技术:普遍所有的HTTP服务器都支持 // 文件上传,文件比较大,断点续传技术:一般的HTTP服务器都不支持,常用的技术用的是Socket(TCP\IP、UDP) } @end
AFN - 监听网络状态 改变 代码
// // HMViewController.m #import "HMViewController.h" #import "AFNetworking.h" @interface HMViewController () @end @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. 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]; } - (void)dealloc { [[AFNetworkReachabilityManager sharedManager] stopMonitoring]; } @end
----------
AFN
AFN对 NSURLConnection 和 NSURLSession的封装 使用简单
ASI对CFNetworking(C语言写的)进行封装 运行效率高 但是使用麻烦
一、2大管理对象 1.AFHTTPRequestOperationManager * 对NSURLConnection的封装 2.AFHTTPSessionManager * 对NSURLSession的封装 二、AFHTTPRequestOperationManager的具体使用 1.创建管理者 AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; 2.封装请求参数 NSMutableDictionary *params = [NSMutableDictionary dictionary]; params[@"username"] = @"哈哈哈"; params[@"pwd"] = @"123"; 3.发送请求 NSString *url = @"http://localhost:8080/MJServer/login"; [mgr POST:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { //这里是主线程 // 请求成功的时候调用这个block NSLog(@"请求成功---%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // 请求失败的时候调用调用这个block NSLog(@"请求失败"); }]; // GET请求 [mgr GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { // 请求成功的时候调用这个block NSLog(@"请求成功---%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // 请求失败的时候调用调用这个block NSLog(@"请求失败"); }]; 三、对服务器返回数据的解析 1.AFN可以自动对服务器返回的数据进行解析 * 默认将服务器返回的数据当做JSON来解析 2.设置对服务器返回数据的解析方式 1> 当做是JSON来解析(默认做法) * mgr.responseSerializer = [AFJSONResponseSerializer serializer]; * responseObject的类型是NSDictionary或者NSArray 2> 当做是XML来解析 * mgr.responseSerializer = [AFXMLParserResponseSerializer serializer]; * responseObject的类型是NSXMLParser 3> 直接返回data * 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data即可 * mgr.responseSerializer = [AFHTTPResponseSerializer serializer]; 3.注意 * 服务器返回的数据一定要跟responseSerializer对得上 1> 服务器返回的是JSON数据 * AFJSONResponseSerializer * AFHTTPResponseSerializer 2> 服务器返回的是XML数据 * AFXMLParserResponseSerializer * AFHTTPResponseSerializer 3> 服务器返回的是其他数据 * AFHTTPResponseSerializer
所以这里还没学socket技术 服务器配置socket 才能支持socket上传
------------
-------------------
这里不用看
文件上传POST拼接
文件上传基础代码(不用自己敲代码)
// // HMViewController.m #import "HMViewController.h" #define HMFileBoundary @"heima" #define HMNewLien @"\r\n" #define HMEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding] @interface HMViewController () @end @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self upload]; } /* 参数1 参数2 结束标记 */ /* * 文件参数 heima Content-Disposition: form-data; name="参数名"; filename="文件名" Content-Type: 文件类型(MIMEType) 文件具体数据 * 非文件参数 heima Content-Disposition: form-data; name="参数名" 参数值 */ - (void)upload { // 1.请求路径 NSURL *url = [NSURL URLWithString:@"http://192.168.15.172:8080/MJServer/upload"]; // 2.创建一个POST请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; // 3.设置请求体 NSMutableData *body = [NSMutableData data]; // 3.1.文件参数 [body appendData:HMEncode(@"--")]; [body appendData:HMEncode(HMFileBoundary)]; [body appendData:HMEncode(HMNewLien)]; [body appendData:HMEncode(@"Content-Disposition: form-data; name=\"file\"; filename=\"test123.png\"")]; [body appendData:HMEncode(HMNewLien)]; [body appendData:HMEncode(@"Content-Type: image/png")]; [body appendData:HMEncode(HMNewLien)]; [body appendData:HMEncode(HMNewLien)]; UIImage *image = [UIImage imageNamed:@"minion_03"]; NSData *imageData = UIImagePNGRepresentation(image); [body appendData:imageData]; [body appendData:HMEncode(HMNewLien)]; // 3.2.用户名参数 [body appendData:HMEncode(@"--")]; [body appendData:HMEncode(HMFileBoundary)]; [body appendData:HMEncode(HMNewLien)]; [body appendData:HMEncode(@"Content-Disposition: form-data; name=\"username\"")]; [body appendData:HMEncode(HMNewLien)]; [body appendData:HMEncode(HMNewLien)]; [body appendData:HMEncode(@"张三")]; [body appendData:HMEncode(HMNewLien)]; // 3.3.结束标记 [body appendData:HMEncode(@"--")]; [body appendData:HMEncode(HMFileBoundary)]; [body appendData:HMEncode(@"--")]; [body appendData:HMEncode(HMNewLien)]; request.HTTPBody = body; // 4.设置请求头(告诉服务器这次传给你的是文件数据,告诉服务器现在发送的是一个文件上传请求) NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", HMFileBoundary]; [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; // 5.发送请求 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"%@", dict); }]; } @end
文件上传基础代码封装(不用自己敲代码)
// // HMViewController.m #import "HMViewController.h" #define HMFileBoundary @"heima" #define HMNewLien @"\r\n" #define HMEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding] @interface HMViewController () @end @implementation HMViewController - (void)viewDidLoad { [super viewDidLoad]; NSString *name = @"jack"; [self test:&name]; NSLog(@"%@", name); // int a = 20; // [self test:&a]; } //- (void)test:(int *)num //{ // *num = 10; //} - (void)test:(NSString **)str { *str = @"rose"; } - (NSString *)MIMEType:(NSURL *)url { // 1.创建一个请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 2.发送请求(返回响应) NSURLResponse *response = nil; [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil]; // 3.获得MIMEType return response.MIMEType; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self upload]; // NSURL *url = [[NSBundle mainBundle] URLForResource:@"autolayout" withExtension:@"txt"]; // NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/课堂共享/第一次考试/考试说明.docx"]; // NSLog(@"%@", url); // NSLog(@"%@", [self MIMEType:url]); } /* 参数1 参数2 结束标记 */ /* * 文件参数 heima Content-Disposition: form-data; name="参数名"; filename="文件名" Content-Type: 文件类型(MIMEType) 文件具体数据 * 非文件参数 heima Content-Disposition: form-data; name="参数名" 参数值 */ - (void)upload { // 非文件参数 NSDictionary *params = @{ @"username" : @"李四", @"pwd" : @"123", @"age" : @30, @"height" : @"1.55" }; NSURL *url = [[NSBundle mainBundle] URLForResource:@"autolayout" withExtension:@"txt"]; NSData *data = [NSData dataWithContentsOfURL:url]; NSString *MIMEType = [self MIMEType:url]; [self upload:@"test.txt" mimeType:MIMEType fileData:data params:params]; // 文件数据 // UIImage *image = [UIImage imageNamed:@"minion_03"]; // NSData *imageData = UIImagePNGRepresentation(image); // // [self upload:@"777.png" mimeType:@"image/png" fileData:imageData params:params]; } - (void)upload:(NSString *)filename mimeType:(NSString *)mimeType fileData:(NSData *)fileData params:(NSDictionary *)params { // 1.请求路径 NSURL *url = [NSURL URLWithString:@"http://192.168.15.172:8080/MJServer/upload"]; // 2.创建一个POST请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; request.HTTPMethod = @"POST"; // 3.设置请求体 NSMutableData *body = [NSMutableData data]; // 3.1.文件参数 [body appendData:HMEncode(@"--")]; [body appendData:HMEncode(HMFileBoundary)]; [body appendData:HMEncode(HMNewLien)]; NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"", filename]; [body appendData:HMEncode(disposition)]; [body appendData:HMEncode(HMNewLien)]; NSString *type = [NSString stringWithFormat:@"Content-Type: %@", mimeType]; [body appendData:HMEncode(type)]; [body appendData:HMEncode(HMNewLien)]; [body appendData:HMEncode(HMNewLien)]; [body appendData:fileData]; [body appendData:HMEncode(HMNewLien)]; // 3.2.非文件参数 [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { [body appendData:HMEncode(@"--")]; [body appendData:HMEncode(HMFileBoundary)]; [body appendData:HMEncode(HMNewLien)]; NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"", key]; [body appendData:HMEncode(disposition)]; [body appendData:HMEncode(HMNewLien)]; [body appendData:HMEncode(HMNewLien)]; [body appendData:HMEncode([obj description])]; [body appendData:HMEncode(HMNewLien)]; }]; // 3.3.结束标记 [body appendData:HMEncode(@"--")]; [body appendData:HMEncode(HMFileBoundary)]; [body appendData:HMEncode(@"--")]; [body appendData:HMEncode(HMNewLien)]; request.HTTPBody = body; // 4.设置请求头(告诉服务器这次传给你的是文件数据,告诉服务器现在发送的是一个文件上传请求) NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", HMFileBoundary]; [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; // 5.发送请求 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"%@", dict); }]; } @end