@SanMao
2015-08-11T15:33:41.000000Z
字数 3708
阅读 1153
网络
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\n
Content-Disposition: form-data; name="file"; filename="文件名称"\r\n
Content-Type: 上传的数据的MIMETYPE\r\n
\r\n
具体数据
\r\n
--和请求头中一模一样的边界\r\n
>非文件参数
Content-Disposition: form-data; name="username"\r\n
\r\n
值\r\n
--结束符号--\r\n
*/
/*
请求头:
边界 : xiaomage
Content-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.创建url
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
// 2.创建request
NSMutableURLRequest *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