最近开发遇到这样一个需求,明确说明需要使用multipart/form-data格式提交图片,所以在网上查阅了一些资料,在这整理一下。multipart/from-data是一种进行表单提交时的消息格式。表单提交数据的时候,默认类型是application/x-www-form-urlencoded,也就是key=value的键值对格式,提交文件的时候使用multipart/from-data。因为是表单提交,所以http请求方式是POST。然后在请求头里设置Content-Type为multipart/from-data指定请求的格式。
post有两种上传方式,这里只列举上传附件的方式(这种请求方式支持文件或文件&普通参数或普通参数)即:
Content-Type = multipart/form-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
其中
name 即为表单请求字段(服务端要的参数字段),fileName为保存在服务端的文件名字,Content-Type为文件类型(image/png 或者video/mpeg4等等),具体可以查看Content-Type参照表
这里着重说下即使服务端要参数是int类型,这里也必须普通参数也必须是字符串对象
#pragma makr -- 上传图片到服务器
-(void)sendImageWithImage:(UIImage *)img{
NSData *imageData;
NSString *imageFormat;
if (UIImagePNGRepresentation(img) != nil) {
imageFormat = @"Content-Type: image/png \r\n";
imageData = UIImagePNGRepresentation(img);
}else{
imageFormat = @"Content-Type: image/jpeg \r\n";
imageData = UIImageJPEGRepresentation(img, 1.0);
}
NSURL *url = [NSURL URLWithString:@"http://192.168.0.254:1010/AddImage.ashx"];
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",_myModel.personID,_myModel.personID];
[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: (相应参数,在这里是_myModel.personID)
NSString *dispositions = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n",@"key"];
[body appendData:[self getDataWithString:dispositions ]];
[body appendData:[self getDataWithString:@"\r\n"]];
[body appendData:[self getDataWithString:_myModel.personID]];
[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"];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [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];
//运用AFN实现照片上传
// AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// NSDictionary *dict = @{@"key":_myModel.personID};
// [manager POST:@"http://192.168.0.254:1010/AddImage.ashx" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// [formData appendPartWithFileData:imageData name:_myModel.personID fileName:[NSString stringWithFormat:@"%@.jpg",_myModel.personID] mimeType:@"image/jpeg"];
// } progress:^(NSProgress * _Nonnull uploadProgress) {
//
// } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// NSLog(@"--------%@",responseObject);
// } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//
// }];
}
-(NSData *)getDataWithString:(NSString *)string{
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
return data;
}
参考链接https://blog.youkuaiyun.com/shuai_summer/article/details/52066076,https://www.jianshu.com/p/a0e3c77d3164,https://blog.youkuaiyun.com/xiaozuo9437/article/details/54090386