文件上传设置请求体的数据格式
2016-09-20 本文已影响0人
莫_名
/*******************************************/
/*
使用POST请求上传文件的过程
1.需要设置请求头
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryhBDKBUWBHnAgvz9c
2.按照特定的格式拼接请求体
------WebKitFormBoundaryhBDKBUWBHnAgvz9c
Content-Disposition: form-data; name="file"; filename="test.png"
Content-Type: image/png
------WebKitFormBoundaryhBDKBUWBHnAgvz9c
Content-Disposition: form-data; name="username"
wendingding
------WebKitFormBoundaryhBDKBUWBHnAgvz9c--
*/
/*******************************************/
//请求体拼接格式
//分隔符:----WebKitFormBoundaryhBDKBUWBHnAgvz9c
//01.文件参数拼接格式
/*
--分隔符
Content-Disposition:参数
Content-Type:参数
空行
文件参数
*/
//02.非文件拼接参数
/*
--分隔符
Content-Disposition:参数
空行
非文件的二进制数据
*/
//03.结尾标识
//--分隔符--
/*******************************************/
#pragma mark--使用NSURLConnection进行文件上传
#define Kboundary @"----WebKitFormBoundaryhBDKBUWBHnAgvz9c"
#define KnewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]
- (void)upload
{
//1.确定请求路径
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
//2.创建一个可变的请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//3.设置请求方式为POST
request.HTTPMethod = @"POST";
//4.设置请求头
NSString *filed = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary];
[request setValue:filed forHTTPHeaderField:@"Content-Type"];
//5.设置请求体
NSMutableData *data = [NSMutableData data];
//5.1 文件参数
/*
--分隔符
Content-Disposition:参数
Content-Type:参数
空行
文件参数
*/
[data appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:KnewLine];
[data appendData:[@"Content-Disposition: form-data; name=\"file\"; filename=\"test.png\"" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:KnewLine];
[data appendData:[@"Content-Type: image/png" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:KnewLine];
// [data appendData:KnewLine];
[data appendData:KnewLine];
UIImage *image = [UIImage imageNamed:@"test"];
NSData *imageData = UIImagePNGRepresentation(image);
[data appendData:imageData];
[data appendData:KnewLine];
//5.2 非文件参数
/*
--分隔符
Content-Disposition:参数
空行
非文件参数的二进制数据
*/
[data appendData:[[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:KnewLine];
[data appendData:[@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:KnewLine];
// [data appendData:KnewLine];
[data appendData:KnewLine];
NSData *nameData = [@"wendingding" dataUsingEncoding:NSUTF8StringEncoding];
[data appendData:nameData];
[data appendData:KnewLine];
//5.3 结尾标识
//--分隔符--
[data appendData:[[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding]];
// [data appendData:KnewLine];
request.HTTPBody = data;
//6.发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {
//需要多做一层判断,程序容错处理
//判断网络请求是否成功(考虑到是否有网,是否请求超时等等情况)
if (connectionError == nil) {
//7.解析服务器返回的数据
NSLog(@"%@",[NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]);
}else
{
NSLog(@"网络请求失败%@",connectionError);
}
}];
}