iOS多线程与网络开发之小文件上传
2015-08-08 15:57
633 查看
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^
我要捐赠: 点击捐赠Cocos2d-X源码下载:点我传送游戏官方下载:http://dwz.cn/RwTjl游戏视频预览:http://dwz.cn/RzHHd游戏开发博客:http://dwz.cn/RzJzI游戏源码传送:http://dwz.cn/Nret1
A.文件上传思路:发送文件数据给服务器使用post请求必须手动设置请求头: 内容大小Content-Length & 内容类型 Content-Type请求体:文件数据文件上传的格式要求十分严格,必须严格遵守由于是一次性加载文件到内存上传,所以只能用于小文件上传 B.实现1.设置POST请求(1)使用POST请求方法(2)设置请求头设置内容长度、内容类型、分割线 (3)设置请求体NSMutableData *body = [NSMutableData data];分割线 + 换行内容描述 + 换行内容类型 + 换行换行文件二进制数据 + 换行分割线-- multipart/form-data 中的内容
![](http://images.cnitblog.com/blog/648473/201501/290028369567280.png)
例如使用chrome上传一张图片:
![](http://images.cnitblog.com/blog/648473/201501/290028390664423.png)
(4)使用本地请求获取某种文件类型的MIMEType
附:常见文件类型的MIMEType
![](http://images.cnitblog.com/blog/648473/201501/290028405036896.png)
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^
我要捐赠: 点击捐赠Cocos2d-X源码下载:点我传送游戏官方下载:http://dwz.cn/RwTjl游戏视频预览:http://dwz.cn/RzHHd游戏开发博客:http://dwz.cn/RzJzI游戏源码传送:http://dwz.cn/Nret1
我要捐赠: 点击捐赠Cocos2d-X源码下载:点我传送游戏官方下载:http://dwz.cn/RwTjl游戏视频预览:http://dwz.cn/RzHHd游戏开发博客:http://dwz.cn/RzJzI游戏源码传送:http://dwz.cn/Nret1
A.文件上传思路:发送文件数据给服务器使用post请求必须手动设置请求头: 内容大小Content-Length & 内容类型 Content-Type请求体:文件数据文件上传的格式要求十分严格,必须严格遵守由于是一次性加载文件到内存上传,所以只能用于小文件上传 B.实现1.设置POST请求(1)使用POST请求方法(2)设置请求头设置内容长度、内容类型、分割线 (3)设置请求体NSMutableData *body = [NSMutableData data];分割线 + 换行内容描述 + 换行内容类型 + 换行换行文件二进制数据 + 换行分割线-- multipart/form-data 中的内容
![](http://images.cnitblog.com/blog/648473/201501/290028369567280.png)
例如使用chrome上传一张图片:
![](http://images.cnitblog.com/blog/648473/201501/290028390664423.png)
(4)使用本地请求获取某种文件类型的MIMEType
1 /** 取得本地文件的MIMEType */ 2 - (void) getMIMEType { 3 // Socket 实现断点上传 4 5 //apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType 6 // UIImage *image = [UIImage imageNamed:@"test"]; 7 // NSData *filedata = UIImagePNGRepresentation(image); 8 // [self upload:@"file" filename:@"test.png" mimeType:@"image/png" data:filedata parmas:@{@"username" : @"123"}]; 9 10 // 给本地文件发送一个请求 11 NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt" withExtension:nil]; 12 NSURLRequest *request = [NSURLRequest requestWithURL:fileurl]; 13 NSURLResponse *repsonse = nil; 14 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil]; 15 16 // 得到mimeType 17 NSLog(@"%@", repsonse.MIMEType); 18 [self upload:@"file" filename:@"itcast.txt" mimeType:repsonse.MIMEType data:data parmas:@{@"username":@"tom", @"type":@"xml"}]; 19 }
附:常见文件类型的MIMEType
![](http://images.cnitblog.com/blog/648473/201501/290028405036896.png)
1 // 2 // ViewController.m 3 // UploadFileDemo 4 // 5 // Created by haomengzhu on 15/1/28. 6 // Copyright (c) 2015年 haomengzhu. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 #define UTF8Encode(str) [str dataUsingEncoding:NSUTF8StringEncoding] 12 13 @interface ViewController () 14 15 - (IBAction)upload; 16 17 @end 18 19 @implementation ViewController 20 21 - (void)viewDidLoad { 22 [super viewDidLoad]; 23 // Do any additional setup after loading the view, typically from a nib. 24 } 25 26 - (void)didReceiveMemoryWarning { 27 [super didReceiveMemoryWarning]; 28 // Dispose of any resources that can be recreated. 29 } 30 31 - (IBAction)upload { 32 UIImage *image = [UIImage imageNamed:@"IMG_0413"]; 33 NSData *imageData = UIImagePNGRepresentation(image); 34 [self upload:@"uploadedFile" filename:@"IMG_0413.PNG" mimeType:@"image/png" data:imageData parmas:nil]; 35 } 36 37 - (void)upload:(NSString *)name filename:(NSString *)filename mimeType:(NSString *)mimeType data:(NSData *)data parmas:(NSDictionary *)params 38 { 39 // 文件上传 40 NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/upload"]; 41 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 42 request.HTTPMethod = @"POST"; 43 44 // 设置请求体 45 NSMutableData *body = [NSMutableData data]; 46 47 /***************文件参数***************/ 48 // 参数开始的标志 49 [body appendData:UTF8Encode(@"--HelloVoidWorldBoundary\r\n")]; 50 // name : 指定参数名(必须跟服务器端保持一致) 51 // filename : 文件名 52 NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", name, filename]; 53 [body appendData:UTF8Encode(disposition)]; 54 NSString *type = [NSString stringWithFormat:@"Content-Type: %@\r\n", mimeType]; 55 [body appendData:UTF8Encode(type)]; 56 57 [body appendData:UTF8Encode(@"\r\n")]; 58 [body appendData:data]; 59 [body appendData:UTF8Encode(@"\r\n")]; 60 61 /***************普通参数***************/ 62 [params enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 63 // 参数开始的标志 64 [body appendData:UTF8Encode(@"--HelloVoidWorldBoundary\r\n")]; 65 NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n", key]; 66 [body appendData:UTF8Encode(disposition)]; 67 68 [body appendData:UTF8Encode(@"\r\n")]; 69 [body appendData:UTF8Encode(obj)]; 70 [body appendData:UTF8Encode(@"\r\n")]; 71 }]; 72 73 /***************参数结束***************/ 74 // HelloVoidWorldBoundary--\r\n 75 [body appendData:UTF8Encode(@"--HelloVoidWorldBoundary--\r\n")]; 76 request.HTTPBody = body; 77 78 // 设置请求头 79 // 请求体的长度 80 [request setValue:[NSString stringWithFormat:@"%zd", body.length] forHTTPHeaderField:@"Content-Length"]; 81 // 声明这个POST请求是个文件上传 82 [request setValue:@"multipart/form-data; boundary=HelloVoidWorldBoundary" forHTTPHeaderField:@"Content-Type"]; 83 84 // 发送请求 85 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 86 NSLog(@"开始上传~~~"); 87 if (data) { 88 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 89 NSLog(@"%@", dict); 90 } else { 91 NSLog(@"上传失败"); 92 } 93 }]; 94 } 95 96 /** 取得本地文件的MIMEType */ 97 - (void) getMIMEType { 98 // Socket 实现断点上传 99 100 //apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType 101 // UIImage *image = [UIImage imageNamed:@"test"]; 102 // NSData *filedata = UIImagePNGRepresentation(image); 103 // [self upload:@"file" filename:@"test.png" mimeType:@"image/png" data:filedata parmas:@{@"username" : @"123"}]; 104 105 // 给本地文件发送一个请求 106 NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt" withExtension:nil]; 107 NSURLRequest *request = [NSURLRequest requestWithURL:fileurl]; 108 NSURLResponse *repsonse = nil; 109 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil]; 110 111 // 得到mimeType 112 NSLog(@"%@", repsonse.MIMEType); 113 [self upload:@"file" filename:@"itcast.txt" mimeType:repsonse.MIMEType data:data parmas:@{@"username":@"tom", @"type":@"xml"}]; 114 } 115 116 117 @end
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载。如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^
我要捐赠: 点击捐赠Cocos2d-X源码下载:点我传送游戏官方下载:http://dwz.cn/RwTjl游戏视频预览:http://dwz.cn/RzHHd游戏开发博客:http://dwz.cn/RzJzI游戏源码传送:http://dwz.cn/Nret1