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