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:paramssuccess:^(AFHTTPRequestOperation *operation, id responseObject) {// 请求成功的时候调用这个blockNSLog(@"请求成功---%@", responseObject);} failure:^(AFHTTPRequestOperation *operation, NSError *error) {// 请求失败的时候调用调用这个blockNSLog(@"请求失败");}]; }
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) {// 当网络状态发生改变的时候调用这个blockswitch (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:paramssuccess:^(AFHTTPRequestOperation *operation, id responseObject) { //这里是主线程// 请求成功的时候调用这个blockNSLog(@"请求成功---%@", responseObject);} failure:^(AFHTTPRequestOperation *operation, NSError *error) {// 请求失败的时候调用调用这个blockNSLog(@"请求失败");}]; // GET请求 [mgr GET:url parameters:paramssuccess:^(AFHTTPRequestOperation *operation, id responseObject) {// 请求成功的时候调用这个blockNSLog(@"请求成功---%@", responseObject);} failure:^(AFHTTPRequestOperation *operation, NSError *error) {// 请求失败的时候调用调用这个blockNSLog(@"请求失败");}];三、对服务器返回数据的解析 1.AFN可以自动对服务器返回的数据进行解析 * 默认将服务器返回的数据当做JSON来解析2.设置对服务器返回数据的解析方式 1> 当做是JSON来解析(默认做法) * mgr.responseSerializer = [AFJSONResponseSerializer serializer]; * responseObject的类型是NSDictionary或者NSArray2> 当做是XML来解析 * mgr.responseSerializer = [AFXMLParserResponseSerializer serializer]; * responseObject的类型是NSXMLParser3> 直接返回data * 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data即可 * mgr.responseSerializer = [AFHTTPResponseSerializer serializer];3.注意 * 服务器返回的数据一定要跟responseSerializer对得上 1> 服务器返回的是JSON数据 * AFJSONResponseSerializer * AFHTTPResponseSerializer2> 服务器返回的是XML数据 * AFXMLParserResponseSerializer * AFHTTPResponseSerializer3> 服务器返回的是其他数据 * 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结束标记*//** 文件参数heimaContent-Disposition: form-data; name="参数名"; filename="文件名"Content-Type: 文件类型(MIMEType)文件具体数据* 非文件参数heimaContent-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
View Code
文件上传基础代码封装(不用自己敲代码)
// // 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.获得MIMETypereturn 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结束标记*//** 文件参数heimaContent-Disposition: form-data; name="参数名"; filename="文件名"Content-Type: 文件类型(MIMEType)文件具体数据* 非文件参数heimaContent-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
View Code
转载于:https://www.cnblogs.com/zff193/p/5297114.html
0923-网络 文件上传相关推荐
- 关于jQuery在Asp.Net Mvc 框架下Ajax文件上传的实现
1. 实现传统的网络文件上传解决方案 首先,我先实现一个传统的网络文件上传方案,建立一个web页面,我还需要一个<form>和两个<input>元素就能解决问题,如在Index ...
- 网络编程 UDP通信的过程 TCP通信过程 多线程文件上传
网络概述 协议 在网络之间传出数据时需要按照指定的标准来传输,标准中规定了数据的格式.大小.传输的方式.传输速率.形成统一规范->按照规范开发的代码->协议(应用层.传输层.网络层.链路层 ...
- [C# 网络编程系列]专题十一:实现一个基于FTP协议的程序——文件上传下载器...
引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...
- wxml 点击图片下载_微信小程序通过ipfs-api 实现图片文件在私有ipfs网络的上传与下载显示...
1.快速搭建IPFS私有网络(docker) 拉取镜像 docker pull docker.io/ipfs/go-ipfs:latest 编写yaml文件 创建两个文件夹并分别命名为:ipfs_no ...
- php上传报文,PHP-02.文件上传、php保存/转移上传的文件、常见的网络传输协议、请求报文及属性、响应报文及属性...
关系数组 array("key"=>"value",...) ; get没有数据大小的限制 post上传大小没有限制 不指定上传方式,默认是get 文件上 ...
- [网络安全提高篇] 一〇四.网络渗透靶场Oracle+phpStudy本地搭建万字详解(SQL注入、XSS攻击、文件上传漏洞)
当您阅读到该篇文章时,作者已经将"网络安全自学篇"设置成了收费专栏,首先说声抱歉.感谢这一年来大家的阅读和陪伴,这100篇安全文章记录了自己从菜鸡到菜鸟的成长史,该部分知识也花了很 ...
- PHP-02.文件上传、php保存/转移上传的文件、常见的网络传输协议、请求报文及属性、响应报文及属性...
关系数组 array("key"=>"value",...) ; get没有数据大小的限制 post上传大小没有限制 不指定上传方式,默认是get 文件上 ...
- 【java笔记】网络编程:文件上传案例
原理:文件的复制 客户端读取本地的文件,把文件上传到服务器,服务器把上传的文件保存到服务器的硬盘上 步骤: 1.客户端使用本地的字节输入流,读取要上传的文件 2.客户端使用网路字节输出流,把读取的文件 ...
- QQ群、讨论组上传文件,由于网络原因上传失败?
QQ群.讨论组上传文件,由于网络原因上传失败? 听语音 | 浏览:194 | 更新:2016-10-29 14:17 | 标签:软件 电脑 1 2 3 4 分步阅读 QQ群.讨论组上传文件,总是由于网 ...
- AFN(向网络发送请求---文件上传)
基本使用 GET请求 1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];NSDictionary *pa ...
最新文章
- 【C++】多线程互斥锁、条件变量
- 太赞了!副业月入3W的技术大佬的公众号,学起来!
- .net和java互操作
- Python 代码尝试
- Struts和Sitemesh整合,实现多个装饰器
- golang 正则 校验 字符串
- 隐藏oracle数据库,如何隐藏Oracle密码
- python 计算s= 12+ 22+ 32 +... + (10*n+2)
- c语言全面,最新版c语言经典习题100例(最全面).doc
- 项目小记: IFRAME引起内存泄露的解决方法
- 【一分钟论文】Deep Biaffine Attention for Neural Dependency Parsing
- 骑士资本高频交易系统事故案例分析
- 导出的excel添加水印
- 开发悬浮球SDK之自定义view 下篇 — 裁剪圆形(以及其他形状)背景图片并设置文字
- Docker 使用手册
- 打开浏览器默认打开hao123网站的主页怎么取消设置?
- shiro框架---shiro配置介绍(一)
- python3爬虫基本操作——抓取股票信息
- “数字炸弹“——练习Python基础知识的小游戏【文末源码地址】
- model.evaluate 和 model.predict
热门文章
- python导入模块介绍_详解Python模块导入方法
- concurrentbag 删除指定元素_Python 列表,for循环,元组的使用(修改、添加、删除、排序、切片)
- alternatives java_linux使用update-alternatives切换java版本
- java实现客服转接_Java微信公众平台开发(9) 关键字回复以及客服接口实现
- 常见的通配符_技术干货 | 常见的mysql注入语句
- android 仿ios三级联动,仿iOS的PickerView控件,有时间选择和选项选择并支持一二三级联动效果...
- java哈希映射干什么的_java – 为什么在哈希映射中有空值或空键是有用的?
- php如何对mysql加锁_PHP+MySQL高并发加锁事务处理问题解决方法
- 新疆大学c语言期末考试题库,2016年新疆师范大学教育科学学院C语言程序设计考研复试题库...
- php7 打开错误提示,PHP7如何开启具体错误显示