日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在調試接口的時候,遇到一個問題,就是多張圖片上傳的時候,不管我上傳多少張,只會上傳成功最后一張,也就是說只有一張圖片上傳成功了,針對這個問題,通過查找資料,找到了原因,首先,在上傳的過程中,我們獲取到本地的image,會放到一個數組里面,在請求方法內進行上傳,也就是說接口只調用一次,但是圖片是在遍歷完成后,一次性上傳成功,現在的話,php后臺的循環邏輯出現問題,走的還是單張上傳邏輯,只是在外層添加了一個循環,這就直接導致了問題的存在,當然安卓那邊是正常的,針對這種情況,有兩種解決方法:

1,在php端,優化多張圖片上傳邏輯,然后兼容下單張上傳的接口,

2,就是在ios端的上傳多張圖片的接口,進行代碼的優化,把請求提內的遍歷,放到外層,然后每上傳一張圖片就調用一次接口,當然這是種笨辦法,因為php后臺無法及時處理,只能在前臺做優化了,

找后臺調試后發現,通過上面的方法上傳多張圖片,實際上只有一張被傳到后臺,可能的原因是:

上傳多張圖片時,由于url的參數沒有變化,iOS默認是同一個請求,只發送了一次請求給后臺,故后臺只收到一張圖片。

廢話不說了,直接上代碼:

正常的上傳圖片的方法:

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: 專門用于拼接需要上傳的數據,在此位置生成一個要上傳的數據體// 這里的_photoArr是你存放圖片的數組for (int i = 0; i < headImage.count; i++) {UIImage *image = headImage[i];NSData *imageData = UIImageJPEGRepresentation(image, 0.5);// 在網絡開發中,上傳文件時,是文件不允許被覆蓋,文件重名// 要解決此問題,// 可以在上傳時使用當前的系統事件作為文件名NSDateFormatter *formatter = [[NSDateFormatter alloc] init];// 設置時間格式[formatter setDateFormat:@"yyyyMMddHHmmss"];NSString *dateString = [formatter stringFromDate:[NSDate date]];NSString *fileName = [NSString stringWithFormat:@"%@.jpg", dateString];/**該方法的參數1. appendPartWithFileData:要上傳的照片[二進制流]2. name:對應網站上[upload.php中]處理文件的字段(比如upload)3. fileName:要保存在服務器上的文件名4. mimeType:上傳的文件的類型*/[formData appendPartWithFileData:imageData name:@"upload" fileName:fileName mimeType:@"image/jpeg"]; // }} progress:^(NSProgress * _Nonnull uploadProgress) {//上傳進度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);}];

?

然后處理過后的代碼:

// 上傳多張圖片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) {//取出單張圖片二進制數據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);// 在網絡開發中,上傳文件時,是文件不允許被覆蓋,文件重名// 要解決此問題,// 可以在上傳時使用當前的系統事件作為文件名NSDateFormatter *formatter = [[NSDateFormatter alloc] init];// 設置時間格式[formatter setDateFormat:@"yyyyMMddHHmmss"];NSString *dateString = [formatter stringFromDate:[NSDate date]];NSString *fileName = [NSString stringWithFormat:@"%@.jpg", dateString];/**該方法的參數1. appendPartWithFileData:要上傳的照片[二進制流]2. name:對應網站上[upload.php中]處理文件的字段(比如upload)3. fileName:要保存在服務器上的文件名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);}]; }

循環調用接口,必然是不合理,不過在這里只談問題的解決!

?

補:另外如果使用AFN,我推薦一個非常牛的封裝類,里面把處理緩存的機制加上了,鏈接如下:

簡書地址:http://www.jianshu.com/p/c695d20d95cb

GitHub地址:https://github.com/jkpang/PPNetworkHelper

轉載于:https://www.cnblogs.com/hero11223/p/6731670.html

總結

以上是生活随笔為你收集整理的iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。