最近在做圖片上傳的功能,使用的AFNetworking提供的方法上傳圖片,發(fā)現(xiàn)多張圖片時總是只有一張圖片上傳到后臺。
有問題的上傳代碼為:
特別提醒:
創(chuàng)建AFHTTPsessionManager時,直接使用[AFHTTPSessionManager manager]會造成內(nèi)存泄漏,需要實現(xiàn)單列方法,可參看AFNetworking的Demo
AFHTTPSessionManager *manager = [TPHTTPTool sharedHTTPManager]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; //設(shè)置響應(yīng)頭可以接收的content-type NSMutableSet *tempSet = [manager.responseSerializer.acceptableContentTypes mutableCopy]; [tempSet addObjectsFromArray:@[@"text/html"]]; manager.responseSerializer.acceptableContentTypes = [tempSet copy]; [manager POST:URL_detailPatientUpdate parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { for(NSInteger i = 0; i < images.count; i++){ //取出單張圖片二進制數(shù)據(jù) id obj = images[i]; UIImage *image = nil; if ([obj isKindOfClass:[UIImage class]]) { image = (UIImage *)obj; }else{ image = [UIImage imageWithContentsOfFile:obj]; } if (image) { NSData *imageData = [TPDataTool dataWithImage:image maxKB:500.0f]; NSLog(@"圖片大小:%ld K" , (long)imageData.length / 1024); // 上傳filename NSString *fileName = [NSString stringWithFormat:@"image_%ld.jpg", (long)blockI]; [formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/jpeg"]; } } } PRogress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responSEObject) { } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { }];找后臺調(diào)試后發(fā)現(xiàn),通過上面的方法上傳多張圖片,實際上只有一張被傳到后臺,可能的原因是:
上傳多張圖片時,由于url的參數(shù)沒有變化,iOS默認是同一個請求,只發(fā)送了一次請求給后臺,故后臺只收到一張圖片。
解決辦法是將循環(huán)把整個請求方法都包起來。代碼為:
// 上傳多張圖片 for(NSInteger i = 0; i < images.count; i++) { AFHTTPSessionManager *manager = [TPHTTPTool sharedHTTPManager]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; //設(shè)置響應(yīng)頭可以接收的content-type NSMutableSet *tempSet = [manager.responseSerializer.acceptableContentTypes mutableCopy]; [tempSet addObjectsFromArray:@[@"text/html"]]; manager.responseSerializer.acceptableContentTypes = [tempSet copy]; __block NSInteger blockI = i; [manager POST:URL_detailPatientUpdate parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { //取出單張圖片二進制數(shù)據(jù) id obj = images[blockI]; UIImage *image = nil; if ([obj isKindOfClass:[UIImage class]]) { image = (UIImage *)obj; }else{ image = [UIImage imageWithContentsOfFile:obj]; } if (image) { NSData *imageData = [TPDataTool dataWithImage:image maxKB:500.0f]; NSLog(@"圖片大小:%ld K" , (long)imageData.length / 1024); // 上傳filename NSString *fileName = [NSString stringWithFormat:@"image_%ld.jpg", (long)blockI]; [formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/jpeg"]; } } progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { }];}
新聞熱點
疑難解答
圖片精選