iOS开发-AFNetworking参数和多文件同时上传【多文件上传】

1. 前言

在项目开发中,我们经常需要上传文件,例如:上传图片,上传各种文件,而有时也需要将参数和多个文件一起上传,不知道大家的项目中遇到了没有,我在最近的项目中,就需要这样的一个功能:同时上传参数、多张图片和音频;

2. 功能实现

在实现此功能之前,需要引入第三方AFNetworking,这是一个非常强大的网络开发工具,这里我就不多说了,下面是我用此工具,封装的一个同时上传参数和多个文件的方法:

2.1 方法名

/**

多文件上传,支持同时上传参数、多个图片、多个音频,【需要将每一个文件转化为date流,用数组传过去】

url:请求的网络地址

pram:请求参数【我一般用dictionary】

arrayImg:图片的date类型数组

arrayAudio:音频的date类型数组

success:上传成功回调

faile:上传失败回调

progress:上传进度回调

*/

+ (void)uploadMoreFileHttpRequestURL:(NSString *)url  RequestPram:(id)pram arrayImg:(NSArray *)arrayImg arrayAudio:(NSArray *)arrayAudio RequestSuccess:(void(^)(id respoes))success RequestFaile:(void(^)(NSError *erro))faile UploadProgress:(void(^)(NSProgress * uploadProgress))progress;

2.2 方法实现

+ (void)uploadMoreFileHttpRequestURL:(NSString *)url  RequestPram:(id)pram arrayImg:(NSArray *)arrayImg arrayAudio:(NSArray *)arrayAudio RequestSuccess:(void(^)(id respoes))success RequestFaile:(void(^)(NSError *erro))faile UploadProgress:(void(^)(NSProgress * uploadProgress))progress{

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

manager.requestSerializer = [AFHTTPRequestSerializer serializer];

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager POST:url parameters:pram constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

///用时间设置文件名

NSDate *date = [NSDate date];

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

[formatter setDateFormat:@"yyyyMMddhhmmss"];

NSString *dateNow = [formatter stringFromDate:date];

NSString *imgFileId = @"handsomekkImg";

//  NSString *avdioFileId = @"ebookAvdio";

///图片文件data追加

for (int i = 0; i < arrayImg.count; i++) {

///文件名:这是多个文件名不一样,多以我就用i实现

NSString *fileName = [NSString stringWithFormat:@"%@%@%d.png",imgFileId,dateNow,i];

///图片支持类型jpg/png/jpeg

[formData appendPartWithFileData:arrayImg[i] name:[NSString stringWithFormat:@"%@%d",imgFileId,i] fileName:fileName mimeType:@"jpg/png/jpeg"];

}

///此处是音频追加和image追加是一样的,不在多描述

//        for (int i = 0; i < arrayAudio.count; i++) {

//            NSString *fileName = [NSString stringWithFormat:@"%@%@%d.mp3",avdioFileId,dateNow,i];

//            [formData appendPartWithFileData:arrayAudio[i] name:imgFileId fileName:fileName mimeType:@"mp3"];

//      }

} progress:^(NSProgress * _Nonnull uploadProgress) {

///进度回调

progress(uploadProgress);

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

///上传功能回调

if (success) {

success(responseObject);

}

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

///失败回调

faile(error);

}];

}

方法中,我们不要求上传的文件名固定,多以文件名不一样就可以,后台去取出来;大家根据自己的需求,定义上传的文件名就可以了。

上一篇:linux上安装Docker(非常简单的安装方法)


下一篇:C Runtime Library、C  Runtime