1. 前言
在项目开发中,我们经常需要上传文件,例如:上传图片,上传各种文件,而有时也需要将参数和多个文件一起上传,不知道大家的项目中遇到了没有,我在最近的项目中,就需要这样的一个功能:同时上传参数、多张图片和音频;
2. 功能实现
在实现此功能之前,需要引入第三方AFNetworking,这是一个非常强大的网络开发工具,这里我就不多说了,下面是我用此工具,封装的一个同时上传参数和多个文件的方法:
2.1 方法名
/** 多文件上传,支持同时上传参数、多个图片、多个音频,【图片为date流,音频为沙盒路径,用数组传过去】 url:请求的网络地址 pram:请求参数【我一般用dictionary】 arrayImg:图片date类型数组 arrayAudio:音频地址数组 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"]; } /// 此处是音频,我传的是音频文件本地沙盒地址,所以用 appendPartWithFileURL 方法 /// for (int i = 0; i < arrayAudio.count; i++) { /// NSString *fileName = [NSString stringWithFormat:@"%@%@%d.caf",avdioFileId,dateNow,i]; /// [formData appendPartWithFileURL:[NSURL URLWithString:arrayAudio[i]] name:[NSString stringWithFormat:@"%@%d",arrayAudio,i] fileName:fileName mimeType:@"application/octet-stream" error:nil]; /// } } 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); }]; }
方法中,我们不要求上传的文件名固定,多以文件名不一样就可以,后台去取出来;可以根据自己的需求,定义上传的文件名就可以。