背景:使用multipart/form-data格式提交图片或者文件到服务器。
方法:使用http请求POST方式,然后在请求头里设置Content-Type为multipart/from-data指定请求的格式。
参数格式:
普通参数:
--boundry\r\n
Content-Disposition: form-data; name=\"%@\"\r\n
\r\n
value
\r\n
文件参数:
--boundry\r\n
Content-Disposition:form-data; name=\"%@\"; filename=\"%@\"\r\nContent-Type: %@\r\n
\r\n
data
\r\n
参数结尾:
--boundry--\r\n
例子:
服务器要求传参:{''upload'': imgdata, "uid": uid}
#pragma mark ------ 上传头像 POST /file/uploadHead
- (void)uploadHeadImage:(UIImage *)image usrId:(NSString *)usrId onSuccess:(void (^)(NSDictionary *dict))onSuccess onFailure:(void(^)(NSError *error))onFailure {
//BaseWebAddr:服务器地址
NSString *urlStr = [BaseWebAddr stringByAppendingString:@"file/uploadHead"];
NSURL *url = [NSURL URLWithString:urlStr];
//在此声明一个字符串常量,代替下面的 BOUNDARY 字符串
// NSString * const POST_BOUNDS = @"----iOSKitFormBoundarycIO0B6mmsXU6koBg";
NSData *imageData;
NSString *imageFormat;
if (UIImagePNGRepresentation(image) != nil) {
imageFormat = @"Content-Type: image/png \r\n";
imageData = UIImagePNGRepresentation(image);
}else{
imageFormat = @"Content-Type: image/jpeg \r\n";
imageData = UIImageJPEGRepresentation(image, 1.0);
}
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
//设置请求实体
NSMutableData *body = [NSMutableData data];
///文件参数
[body appendData:[self getDataWithString:@"--BOUNDARY\r\n" ]];
NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@.jpg\"\r\n",@"upload",usrId];
[body appendData:[self getDataWithString:disposition ]];
[body appendData:[self getDataWithString:imageFormat]];
[body appendData:[self getDataWithString:@"\r\n"]];
[body appendData:imageData];
[body appendData:[self getDataWithString:@"\r\n"]];
//普通参数
[body appendData:[self getDataWithString:@"--BOUNDARY\r\n" ]];
//上传参数需要key
NSString *dispositions = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n",@"uid"];
[body appendData:[self getDataWithString:dispositions ]];
[body appendData:[self getDataWithString:@"\r\n"]];
[body appendData:[self getDataWithString:usrId]];
[body appendData:[self getDataWithString:@"\r\n"]];
//参数结束
[body appendData:[self getDataWithString:@"--BOUNDARY--\r\n"]];
request.HTTPBody = body;
//设置请求体长度
NSInteger length = [body length];
[request setValue:[NSString stringWithFormat:@"%ld",length] forHTTPHeaderField:@"Content-Length"];
//设置 POST请求文件上传
[request setValue:@"multipart/form-data; boundary=BOUNDARY" forHTTPHeaderField:@"Content-Type"];
NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSJSONSerialization *object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
NSDictionary *dict = (NSDictionary *)object;
NSLog(@"=====%@",[dict objectForKey:@"success"]);
}];
//开始任务
[dataTask resume];
}
-(NSData *)getDataWithString:(NSString *)string{
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
return data;
}