IOS AFNetWork 多附件上传

本文介绍了使用AFNetworking实现iOS应用中多个文件上传到单一接口的详细步骤,通过构造请求体并枚举文件数据,成功完成批量上传。适用于有类似需求的iOS开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

距上一篇IOS AFNETWork 附件上传博文发布已有数月之久,最近在项目中又有了变态的需求在一个页面中有多个附件域,但是接口只有一个。于是边翻看AFNetwork 的api 最终找到了这样一个结构


NSURLSessionDataTask *task = [httpClient POST:url parameters:parame constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        [mutilableBodys enumerateObjectsUsingBlock:^(NSDictionary *cellBodyDic, NSUInteger idx, BOOL *stop) {

            [formData appendPartWithFileData:cellBodyDic[@"body"] name:cellBodyDic[@"name"] fileName:cellBodyDic[@"fileName"] mimeType:cellBodyDic[@"mimeType"] ];

        }];

        

    } success:^(NSURLSessionDataTask *task, id responseObject) {

        if (completBlock) {

            completBlock(responseObject,nil);

        }

    } failure:^(NSURLSessionDataTask *task, NSError *error) {

        if (completBlock) {

            completBlock(nil,error);

        }

    }];




最后和服务端测试发现文件上传成功了,兴奋之余写下本文,用作日后查询之用

全文内容如下

+(NSURLSessionDataTask *)upLoadFileSWithAction:(NSString *)url andFileItem:(NSDictionary *)fileItemDic andFileType:(NSDictionary *)fileTypeDic andUploadedSize:(NSUInteger)hsize andParames:(NSDictionary *)parame CompleteBlock:(void(^)(id responseObject,NSError *error))completBlock{

    

    AFAppDotNetAPIClient *httpClient = [AFAppDotNetAPIClient sharedClient];

    

    NSString *stringBoundary = @"----WebKitFormBoundarygTijO0scBddIKz8T";

    NSString *hhh_date =[NSString stringWithFormat:@"\r\n--%@\r\n", stringBoundary];

    NSMutableArray *mutilableBodys =[NSMutableArray array];

    

    NSArray *fNameKeys = [fileItemDic allKeys];

    for (NSString *fNameKey in fNameKeys) {

        

         NSMutableData *postBody = [[NSMutableData alloc] init];

         NSString *filePath  =[fileItemDic objectForKey:fNameKey];

         NSString *fNameValue = [[filePath pathComponents]lastObject];

         NSString *nameValue =[fNameValue stringByDeletingPathExtension];

        

         NSData *imageData = [NSData dataWithContentsOfFile:filePath];

         NSString *fileType = [fileTypeDic objectForKey:fNameKey];

        

         [postBody appendData:[[NSString stringWithFormat:@"\r\n\r\n--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

         [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n",fNameKey,fNameValue] dataUsingEncoding:NSUTF8StringEncoding]];

         NSString *contentFileType =[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n",fileType];

        [postBody appendData:[contentFileType dataUsingEncoding:NSUTF8StringEncoding]];

        [postBody appendData:imageData];

        [postBody appendData:[hhh_date dataUsingEncoding:NSUTF8StringEncoding]];

        [postBody appendData:[@"Content-Disposition: form-data; name=\"timestamp\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

        [postBody appendData:[@"0.38387341564521194" dataUsingEncoding:NSUTF8StringEncoding]];

        

        NSDictionary *cellBodyDic =@{@"body":postBody,@"name":nameValue, @"fileName":fNameValue, @"mimeType":fileType};

        [mutilableBodys  addObject:cellBodyDic];

        

    }

    NSURLSessionDataTask *task = [httpClient POST:url parameters:parame constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

        [mutilableBodys enumerateObjectsUsingBlock:^(NSDictionary *cellBodyDic, NSUInteger idx, BOOL *stop) {

            [formData appendPartWithFileData:cellBodyDic[@"body"] name:cellBodyDic[@"name"] fileName:cellBodyDic[@"fileName"] mimeType:cellBodyDic[@"mimeType"] ];

        }];

        

    } success:^(NSURLSessionDataTask *task, id responseObject) {

        if (completBlock) {

            completBlock(responseObject,nil);

        }

    } failure:^(NSURLSessionDataTask *task, NSError *error) {

        if (completBlock) {

            completBlock(nil,error);

        }

    }];

    return task;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值