iOS里实现multipart/form-data格式上传文件

最近开发遇到这样一个需求,明确说明需要使用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






  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值