iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
在調(diào)試接口的時(shí)候,遇到一個(gè)問(wèn)題,就是多張圖片上傳的時(shí)候,不管我上傳多少?gòu)?#xff0c;只會(huì)上傳成功最后一張,也就是說(shuō)只有一張圖片上傳成功了,針對(duì)這個(gè)問(wèn)題,通過(guò)查找資料,找到了原因,首先,在上傳的過(guò)程中,我們獲取到本地的image,會(huì)放到一個(gè)數(shù)組里面,在請(qǐng)求方法內(nèi)進(jìn)行上傳,也就是說(shuō)接口只調(diào)用一次,但是圖片是在遍歷完成后,一次性上傳成功,現(xiàn)在的話,php后臺(tái)的循環(huán)邏輯出現(xiàn)問(wèn)題,走的還是單張上傳邏輯,只是在外層添加了一個(gè)循環(huán),這就直接導(dǎo)致了問(wèn)題的存在,當(dāng)然安卓那邊是正常的,針對(duì)這種情況,有兩種解決方法:
1,在php端,優(yōu)化多張圖片上傳邏輯,然后兼容下單張上傳的接口,
2,就是在ios端的上傳多張圖片的接口,進(jìn)行代碼的優(yōu)化,把請(qǐng)求提內(nèi)的遍歷,放到外層,然后每上傳一張圖片就調(diào)用一次接口,當(dāng)然這是種笨辦法,因?yàn)閜hp后臺(tái)無(wú)法及時(shí)處理,只能在前臺(tái)做優(yōu)化了,
找后臺(tái)調(diào)試后發(fā)現(xiàn),通過(guò)上面的方法上傳多張圖片,實(shí)際上只有一張被傳到后臺(tái),可能的原因是:
上傳多張圖片時(shí),由于url的參數(shù)沒(méi)有變化,iOS默認(rèn)是同一個(gè)請(qǐng)求,只發(fā)送了一次請(qǐng)求給后臺(tái),故后臺(tái)只收到一張圖片。
廢話不說(shuō)了,直接上代碼:
正常的上傳圖片的方法:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.requestSerializer.timeoutInterval = 20;manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"multipart/form-data", @"application/json", @"text/html", @"image/jpeg", @"image/png", @"application/octet-stream", @"text/json", nil];[manager POST:[NSString stringWithFormat:@"%@%@",HostUrl,getInfoPhoto] parameters:parameterDict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {// formData: 專門(mén)用于拼接需要上傳的數(shù)據(jù),在此位置生成一個(gè)要上傳的數(shù)據(jù)體// 這里的_photoArr是你存放圖片的數(shù)組for (int i = 0; i < headImage.count; i++) {UIImage *image = headImage[i];NSData *imageData = UIImageJPEGRepresentation(image, 0.5);// 在網(wǎng)絡(luò)開(kāi)發(fā)中,上傳文件時(shí),是文件不允許被覆蓋,文件重名// 要解決此問(wèn)題,// 可以在上傳時(shí)使用當(dāng)前的系統(tǒng)事件作為文件名NSDateFormatter *formatter = [[NSDateFormatter alloc] init];// 設(shè)置時(shí)間格式[formatter setDateFormat:@"yyyyMMddHHmmss"];NSString *dateString = [formatter stringFromDate:[NSDate date]];NSString *fileName = [NSString stringWithFormat:@"%@.jpg", dateString];/**該方法的參數(shù)1. appendPartWithFileData:要上傳的照片[二進(jìn)制流]2. name:對(duì)應(yīng)網(wǎng)站上[upload.php中]處理文件的字段(比如upload)3. fileName:要保存在服務(wù)器上的文件名4. mimeType:上傳的文件的類型*/[formData appendPartWithFileData:imageData name:@"upload" fileName:fileName mimeType:@"image/jpeg"]; // }} progress:^(NSProgress * _Nonnull uploadProgress) {//上傳進(jìn)度dispatch_sync(dispatch_get_main_queue(), ^{NSLog(@"progress is %@",uploadProgress);});} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {success(responseObject);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {failure(error);}];?
然后處理過(guò)后的代碼:
// 上傳多張圖片for(NSInteger i = 0; i < headImage.count; i++){AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.requestSerializer.timeoutInterval = 20;manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain", @"multipart/form-data", @"application/json", @"text/html", @"image/jpeg", @"image/png", @"application/octet-stream", @"text/json", nil];__block NSInteger blockI = i;[manager POST:[NSString stringWithFormat:@"%@%@",HostUrl,getInfoPhoto] parameters:parameterDict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {//取出單張圖片二進(jìn)制數(shù)據(jù)id obj = headImage[blockI];UIImage *image = nil;if ([obj isKindOfClass:[UIImage class]]) {image = (UIImage *)obj;}else{image = [UIImage imageWithContentsOfFile:obj];}if (image) {UIImage *image = headImage[i];NSData *imageData = UIImageJPEGRepresentation(image, 0.5);// 在網(wǎng)絡(luò)開(kāi)發(fā)中,上傳文件時(shí),是文件不允許被覆蓋,文件重名// 要解決此問(wèn)題,// 可以在上傳時(shí)使用當(dāng)前的系統(tǒng)事件作為文件名NSDateFormatter *formatter = [[NSDateFormatter alloc] init];// 設(shè)置時(shí)間格式[formatter setDateFormat:@"yyyyMMddHHmmss"];NSString *dateString = [formatter stringFromDate:[NSDate date]];NSString *fileName = [NSString stringWithFormat:@"%@.jpg", dateString];/**該方法的參數(shù)1. appendPartWithFileData:要上傳的照片[二進(jìn)制流]2. name:對(duì)應(yīng)網(wǎng)站上[upload.php中]處理文件的字段(比如upload)3. fileName:要保存在服務(wù)器上的文件名4. mimeType:上傳的文件的類型*/[formData appendPartWithFileData:imageData name:@"upload" fileName:fileName mimeType:@"image/jpeg"]; // }} progress:^(NSProgress * _Nonnull uploadProgress) {NSLog(@"progress is %@",uploadProgress);} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {success(responseObject);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {failure(error);}]; }循環(huán)調(diào)用接口,必然是不合理,不過(guò)在這里只談問(wèn)題的解決!
?
補(bǔ):另外如果使用AFN,我推薦一個(gè)非常牛的封裝類,里面把處理緩存的機(jī)制加上了,鏈接如下:
簡(jiǎn)書(shū)地址:http://www.jianshu.com/p/c695d20d95cb
GitHub地址:https://github.com/jkpang/PPNetworkHelper
轉(zhuǎn)載于:https://www.cnblogs.com/hero11223/p/6731670.html
總結(jié)
以上是生活随笔為你收集整理的iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: zabbix邮件发不出去
- 下一篇: 使用ABBYY FineReader进行