A.文件上传
思路:
发送文件数据给服务器
使用post请求
必须手动设置请求头: 内容大小Content-Length & 内容类型 Content-Type
请求体:文件数据
文件上传的格式要求十分严格,必须严格遵守
由于是一次性加载文件到内存上传,所以只能用于小文件上传
B.实现
1.设置POST请求
(1)使用POST请求方法
(2)设置请求头
设置内容长度、内容类型、分割线
(3)设置请求体
NSMutableData *body = [NSMutableData data];
分割线 + 换行
内容描述 + 换行
内容类型 + 换行
换行
文件二进制数据 + 换行
分割线--
multipart/form-data 中的内容
例如使用Chrome上传一张图片:
(4)使用本地请求获取某种文件类型的MIMEType
1/** 取得本地文件的MIMEType*/2- (void) getMIMEType {3//Socket 实现断点上传45//apache-tomcat-6.0.41/conf/web.xml查找 文件的 mimeType6//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"}];910//给本地文件发送一个请求11NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt"withExtension:nil];12NSURLRequest *request =[NSURLRequest requestWithURL:fileurl];13NSURLResponse *repsonse =nil;14NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil];1516//得到mimeType17NSLog(@"%@", repsonse.MIMEType);18[self upload:@"file"filename:@"itcast.txt"mimeType:repsonse.MIMEType data:data parmas:@{@"username":@"tom",@"type":@"xml"}];19}
附:常见文件类型的MIMEType
1//2//ViewController.m3//UploadFileDemo4//5//Created by hellovoidworld on 15/1/28.6//Copyright (c) 2015年 hellovoidworld. All rights reserved.7//89#import"ViewController.h"1011#defineUTF8Encode(str) [str dataUsingEncoding:NSUTF8StringEncoding]1213@interfaceViewController ()1415-(IBAction)upload;1617@end1819@implementationViewController2021- (void)viewDidLoad {22[super viewDidLoad];23//Do any additional setup after loading the view, typically from a nib.24}2526- (void)didReceiveMemoryWarning {27[super didReceiveMemoryWarning];28//Dispose of any resources that can be recreated.29}3031-(IBAction)upload {32UIImage *image = [UIImage imageNamed:@"IMG_0413"];33NSData *imageData =UIImagePNGRepresentation(image);34[self upload:@"uploadedFile"filename:@"IMG_0413.PNG"mimeType:@"image/png"data:imageData parmas:nil];35}3637- (void)upload:(NSString *)name filename:(NSString *)filename mimeType:(NSString *)mimeType data:(NSData *)data parmas:(NSDictionary *)params38{39//文件上传40NSURL *url = [NSURL URLWithString:@"http://192.168.0.21:8080/MyTestServer/upload"];41NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:url];42request.HTTPMethod =@"POST";4344//设置请求体45NSMutableData *body =[NSMutableData data];4647/***************文件参数***************/48//参数开始的标志49[body appendData:UTF8Encode(@"--HelloVoidWorldBoundary\r\n")];50//name : 指定参数名(必须跟服务器端保持一致)51//filename : 文件名52NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", name, filename];53[body appendData:UTF8Encode(disposition)];54NSString *type = [NSString stringWithFormat:@"Content-Type: %@\r\n", mimeType];55[body appendData:UTF8Encode(type)];5657[body appendData:UTF8Encode(@"\r\n")];58[body appendData:data];59[body appendData:UTF8Encode(@"\r\n")];6061/***************普通参数***************/62[paramsenumerateKeysAndObjectsUsingBlock:^(idkey,idobj, BOOL *stop) {63//参数开始的标志64[body appendData:UTF8Encode(@"--HelloVoidWorldBoundary\r\n")];65NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n", key];66[body appendData:UTF8Encode(disposition)];6768[body appendData:UTF8Encode(@"\r\n")];69[body appendData:UTF8Encode(obj)];70[body appendData:UTF8Encode(@"\r\n")];71}];7273/***************参数结束***************/74//HelloVoidWorldBoundary--\r\n75[body appendData:UTF8Encode(@"--HelloVoidWorldBoundary--\r\n")];76request.HTTPBody =body;7778//设置请求头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"];8384//发送请求85[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {86NSLog(@"开始上传~~~");87if(data) {88NSDictionary *dict =[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];89NSLog(@"%@", dict);90}else{91NSLog(@"上传失败");92}93}];94}9596/** 取得本地文件的MIMEType*/97- (void) getMIMEType {98//Socket 实现断点上传99100//apache-tomcat-6.0.41/conf/web.xml 查找 文件的 mimeType101//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"}];104105//给本地文件发送一个请求106NSURL *fileurl = [[NSBundle mainBundle] URLForResource:@"itcast.txt"withExtension:nil];107NSURLRequest *request =[NSURLRequest requestWithURL:fileurl];108NSURLResponse *repsonse =nil;109NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&repsonse error:nil];110111//得到mimeType112NSLog(@"%@", repsonse.MIMEType);113[self upload:@"file"filename:@"itcast.txt"mimeType:repsonse.MIMEType data:data parmas:@{@"username":@"tom",@"type":@"xml"}];114}115116117@end