iOS里实现multipartform-data格式上传文件

xiaoxiao2021-02-28  44

最近开发遇到这样一个需求,明确说明需要使用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.csdn.net/shuai_summer/article/details/52066076,https://www.jianshu.com/p/a0e3c77d3164,https://blog.csdn.net/xiaozuo9437/article/details/54090386

转载请注明原文地址: https://www.6miu.com/read-2612444.html

最新回复(0)