iOS--表单formdata上传文件

背景:使用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;
    
}

 


http://www.niftyadmin.cn/n/704305.html

相关文章

手把手带你打造一个 Android 热修复框架

本文来自网易云社区作者:王晨彦Application 处理上面我们已经对所有 class 文件插入了 Hack 的引用,而插入 dex 是在 Application 中,Application 启动前肯定要先加载 Application.class,但这时 dex 还没被插入,因此肯…

React Native -- 'config.h' file not found

解决方法 打开Terminal,执行: cd node_modules/react-native/third-party/glog-0.3.4 ../../scripts/ios-configure-glog.sh 参考:https://blog.csdn.net/qq_28978893/article/details/78720488

XMind使用教程入门

什么是思维导图 借用百度百科的介绍,思维导图又称脑图、心智导图。是一种将思维形象化的方法,它利用图文并重的方法,将各级主题之间的关系用相互隶属与相关的层级图表现出来,将主题关键词与图像、颜色等建立记忆连接,从…

Mac上Flutter安装配置

1.下载Flutter SDK压缩包 地址:https://flutter.dev/docs/development/tools/sdk/archive?tabmacos#macos 2.选择解压的目的文件夹 如:创建development文件夹 mkdir development 进入development文件夹 cd development 解压SDK,unzip解…

一步一步读懂JS继承模式

JavaScript作为一种弱类型编程语言被广泛使用于前端的各种技术中,由于JS中并没有“类”的概念,所以js的OOP特性一直没有得到足够的重视,而且有相当一部分使用js的项目中采用的都是面向过程的编程方式。但是随着项目规模的不断扩大&#xff0c…

XMPP学习(一)Mac安装MySQL

下载MySQL(官网—> DOWNLOADS —> MySQL Community Server —> 选择对应系统版本的安装包) 1.地址:https://dev.mysql.com/downloads/mysql/ 2.提示:下载时,会提醒创建免费装户,可以选择底部的 N…

XMPP学习(二)Mac安装Openfire

准备: 安装openfire前,需要安装Java环境(jdk)。 参考:https://blog.csdn.net/Crazy_SunShine/article/details/80938098 1.下载 地址:https://github.com/igniterealtime/Openfire/releases/tag/v4.3.2…

BZOJ3307雨天的尾巴——线段树合并

题目描述 N个点,形成一个树状结构。有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。完成所有发放后,每个点存放最多的是哪种物品。 输入 第一行数字N,M接下来N-1行,每行两个…