@SanMao
2015-08-11T07:33:41.000000Z
字数 3708
阅读 1295
网络
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1vk1tQb3tzVrbr3C
#import "ViewController.h"#import "NSString+MIME.h"#define kBoundary @"----xiaomage"#define kNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]#define kEncode(string) [string dataUsingEncoding:NSUTF8StringEncoding]/*普通POST:请求头: 不需要设置额外的参数请求体: 直接将数据转换成二进制放到请求体中即可文件上传POST:请求头: 必须写上一句参数Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1vk1tQb3tzVrbr3C请求体: 必须按照固定的格式来编写, 并且一个换行/一个空格/一个字符都不能少>文件参数--和请求头中一模一样的边界\r\nContent-Disposition: form-data; name="file"; filename="文件名称"\r\nContent-Type: 上传的数据的MIMETYPE\r\n\r\n具体数据\r\n--和请求头中一模一样的边界\r\n>非文件参数Content-Disposition: form-data; name="username"\r\n\r\n值\r\n--结束符号--\r\n*//*请求头:边界 : xiaomageContent-Type: multipart/form-data; boundary=边界请求体>文件参数--边界\r\n参数\r\n参数\r\n\r\n具体数据\r\n--边界\r\n>非文件参数参数\r\n\r\n值\r\n--边界--\r\n*/@interface ViewController ()@end@implementation ViewController- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{// NSLog(@"%@", [self mimetypeWithString:@"/Users/apple/Desktop/课堂共享/第2期(广州)2015年06月15日iOS大神班-0718.xls"]);NSLog(@"%@", [@"/Users/apple/Desktop/Demo.zip" mimetype]);}- (NSString *)mimetypeWithString:(NSString *)string{NSURL *url = [NSURL fileURLWithPath:string];NSURLRequest *request = [NSURLRequest requestWithURL:url];NSHTTPURLResponse *response = nil;[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];return response.MIMEType;}- (void)upload{// 1.创建urlNSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];// 2.创建requestNSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];// 3.设置请求头// 设置请求头的目的: 告诉服务器是上传文件, 而不是传递普通参数NSString *field = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", kBoundary];[request setValue:field forHTTPHeaderField:@"Content-Type"];/******************************************************************/// 4.设置请求体request.HTTPMethod = @"POST";NSMutableData *data = [NSMutableData data];/******************************************************************/// 4.1文件参数[data appendData:[[NSString stringWithFormat:@"--%@", kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];[data appendData:kNewLine];[data appendData:kEncode(@"Content-Disposition: form-data; name=\"file\"; filename=\"abc.png\"")];[data appendData:kNewLine];// 目的: 告诉服务器上传的数据的真实类型[data appendData:kEncode(@"Content-Type: image/png")];[data appendData:kNewLine];[data appendData:kNewLine];UIImage *image = [UIImage imageNamed:@"pause"];NSData *imageData = UIImagePNGRepresentation(image);[data appendData:imageData];[data appendData:kNewLine];[data appendData:kNewLine];[data appendData:[[NSString stringWithFormat:@"--%@", kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];[data appendData:kNewLine];/******************************************************************/// 4.2非文件参数[data appendData:kEncode(@"Content-Disposition: form-data; name=\"username\"")];[data appendData:kNewLine];[data appendData:kNewLine];[data appendData:kEncode(@"lnj")];[data appendData:kNewLine];/******************************************************************/// 4.3添加结束标记[data appendData:[[NSString stringWithFormat:@"--%@--", kBoundary] dataUsingEncoding:NSUTF8StringEncoding]];[data appendData:kNewLine];request.HTTPBody = data;/******************************************************************/// 设置请求头[request setValue:[NSString stringWithFormat:@"%zd", data.length] forHTTPHeaderField:@"Content-Length"];// 5.利用NSURLConnection发送请求[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);}];}@end