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






以下是iOS Objective-C实现multipart/form-data格式上传文件的示例代码: ```objective-c // 设置请求URL NSURL *url = [NSURL URLWithString:@"http://example.com/upload"]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 设置请求方法为POST [request setHTTPMethod:@"POST"]; // 设置请求头 NSString *boundary = @"Boundary+0xAbCdEfGbOuNdArY"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; [request setValue:contentType forHTTPHeaderField:@"Content-Type"]; // 设置请求体 NSMutableData *body = [NSMutableData data]; // 添加文件数据 NSData *fileData = UIImageJPEGRepresentation(image, 1.0); if (fileData) { [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@\"\r\n", @"image.jpg"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n", @"image/jpeg"] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:fileData]; [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; } // 添加其他参数 NSDictionary *parameters = @{@"key1": @"value1", @"key2": @"value2"}; for (NSString *key in parameters) { [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"%@\r\n", parameters[key]] dataUsingEncoding:NSUTF8StringEncoding]]; } // 添加请求结束标志 [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // 设置请求体长度 [request setValue:[NSString stringWithFormat:@"%lu", (unsigned long)[body length]] forHTTPHeaderField:@"Content-Length"]; // 设置请求体 [request setHTTPBody:body]; // 发送请求 NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // 处理响应 }]; [task resume]; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值