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

2020-08-06  本文已影响0人  New_卡迪熊

最近做项目中有个后台api上传文件、是要求使用multipart/form-data格式上传文件。
然后找了下资料,发现很少,是要用系统自带网络请求才能实现multipart/form-data格式上传,AFNet没有这样的api。也在网上找了些资料然后自己整合了一下
、、、
+(void)PostSubmitiphotoWithText:(NSString *)text name:(NSString *)name AppID:(NSString *)AppID Image:(NSData *)image twoname:(NSString *)twoname imageArray:(NSMutableArray *)imageArray filename:(NSString *)filename completionHandler:(void(^)(NSData *data, NSError *error))completion
{

NSURL *url = [NSURL URLWithString:@"http://app.hy-chip.com/hyChip3/feedback/information"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
//设置请求实体
NSMutableData *body = [NSMutableData data];
 NSDate *date = [NSDate date];
 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
 [formatter setDateFormat:@"yyyy-MM-dd HH:mm"];
 NSString *time_now = [formatter stringFromDate:date];
 NSString *nameID = @"5";
 //4.设置请求体
 NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                text,           @"content",
                                @"799610809@qq.com",        @"contact",
                                time_now,       @"time",
                                nameID,         @"appId",
                                nil];
 
 NSMutableDictionary *dictParmater = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                      kAsign,           @"sign",
                                      @"1.4",           @"ver",
                                      params,           @"params",
                                      @"123456",        @"id",
                                      nil];

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictParmater options:NSJSONWritingPrettyPrinted error:nil];
NSString*jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];

 NSMutableString *mutStr = [NSMutableString stringWithString:jsonString];
NSRange range = {0,jsonString.length};
//去掉字符串中的空格
[mutStr replaceOccurrencesOfString:@"" withString:@"" options:NSLiteralSearch range:range];
NSRange range2 = {0,mutStr.length};
//去掉字符串中的换行符
[mutStr replaceOccurrencesOfString:@"\n" withString:@"" options:NSLiteralSearch range:range2];
//普通参数
[body appendData:[self getDataWithString:@"--BOUNDARY\r\n" ]];
//上传参数需要key: (相应参数,在这里是_myModel.personID)
NSString *dispositions = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n",@"content"];
[body appendData:[self getDataWithString:dispositions ]];
[body appendData:[self getDataWithString:@"\r\n"]];
[body appendData:[self getDataWithString:mutStr]];
[body appendData:[self getDataWithString:@"\r\n"]];

for (int i = 0; i<imageArray.count-1; i++) {
    //文件参数
    UIImage * img = imageArray[i];
    NSData *imageData = [NSData data];
    NSString *imageFormat = @"";
    imageFormat = @"Content-Type: image/jpeg \r\n";
    imageData = UIImageJPEGRepresentation(img,0.6);   //图片压缩
    
    [body appendData:[self getDataWithString:@"--BOUNDARY\r\n" ]];
    NSString *disposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@.jpg\"\r\n",@"file",filename];
    [body appendData:[self getDataWithString:disposition ]];
    
    NSLog(@"%@___________",body);
    
    [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"]];
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"];


    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {  // 当请求结束的时候调用
        if (!data){
            NSLog(@"返回数据为空-%@",data);
            return;
        }
        if (!connectionError) {

        }
        dispatch_async(dispatch_get_main_queue(), ^{
            completion(data,connectionError);

        });

    }];

}
、、、

然后上传事件里面直接调用,参数最好和后台人员沟通对比一下。
///
for(NSInteger i = 0; i < imagesArray.count-1; i++)
{
//取出单张图片二进制数据
imageData = imagesArray[i];
// imageData = [NSKeyedArchiver archivedDataWithRootObject:imagesArray[i]]; //上传一张照片成功
//imageData = UIImagePNGRepresentation(imagesArray[i]);
// 上传的参数名,在服务器端保存文件的文件夹名
Name = [NSString stringWithFormat:@"%@%ld", imageData, i+1];
NSLog(@"Name------------%@",Name);
// 上传filename
fileName = [NSString stringWithFormat:@"%@.jpg", Name];
NSLog(@"fileName------------%@",fileName);

    }
    
    [THFunCloud  PostSubmitiphotoWithText:self.textView.text name:@"799610809@qq.com"AppID:@"5"Image:imageData twoname:@"file"imageArray:imagesArray filename:fileName completionHandler:^(NSData *data, NSError *error){
        if (!error) {
            NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
            NSString *msg = [jsonDict objectForKey:@"msg"];
            NSString *ret_code = [jsonDict objectForKey:@"code"];
            NSLog(@"%d-----------",ret_code.intValue);
            if (ret_code.intValue != 200) {
                [SVProgressHUD showErrorWithStatus:msg];
                [SVProgressHUD dismissWithDelay:2.0];
            }else{
                [SVProgressHUD showSuccessWithStatus:NSLocalizedString(@"已上传", nil)];
                [SVProgressHUD dismissWithDelay:2.0];
                [self.navigationController popViewControllerAnimated:YES];
            }
            
            NSString * str  =[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%s:返回数据2222:%@",__func__,str);
        }
    }];
    
}

///

希望能帮助你们!

上一篇下一篇

猜你喜欢

热点阅读