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); }]; }
方法中,我們不要求上傳的文件名固定,多以文件名不一樣就可以,后台去取出來;可以根據自己的需求,定義上傳的文件名就可以。
