ios 上传图片失败 小程序_iOS上传图片,就是有这种不一样的操作!
很久沒發文了,最近這段時間在看前端的東西,在忙微商城webapp的事,用的vue2.0開發,打算過段時間記錄總結那方面的一些知識點和坑。下面進入今天的主題。
說到iOS上傳圖片,網上的資料滿滿皆是,分為兩大類。
1. 轉換為 base64位
2.轉換為二進制流
之前的項目里有個客訴的功能模塊需要用戶最多上傳4張圖片的需求,用的方法是第二種。在開發小程序之前,直接將多張圖片用for循環將每張圖片轉換為二進制流再一起上傳,一切都很正常。
代碼如下圖:
將圖片逐張轉化成二進制流再一起上傳.png
但在開發小程序版的此功能時發現,微信暫時不支持多張圖片同時上傳,這就讓人著實蛋疼一陣。沒辦法,為了同時適配APP端和微信端,后臺就改接口,由原來的一個接口變成了兩個接口,多出來的那個接口(暫且叫B接口)為單獨上傳圖片用的,每次只能上傳一張,上傳成功后返回一個關于上傳圖片的url,并存入到一個數組C中,而原來的接口(A接口)則不需要圖片,而是將投訴的內容以及B接口返回的url產生的數組C一起加在參數字典中post上傳即可了。可能到這你有點暈,下面先看下流程圖吧
圖片上傳流程圖.png
新建一個 imgUntil 類 ,代碼如下:
imgUntil.h文件
#import
#import
typedef void (^FinishUploadAllBlock)(NSMutableArray *imgUrls);//圖片上傳完成回調 將服務器返回的url存到數組并將數組返回
@interface ImgUntil : NSObject
/*
param:
photosArr:由原圖片數組copy過來的可變數組
desturls :圖片上傳成功后返回url存放用的數組并回調給controller
finish :block
controller :當前控制器
*/
+(void)synUploadAll:(NSMutableArray *)photosArr And:(NSMutableArray *)desturls finish:(FinishUploadAllBlock)finish inController:(UIViewController *)controller;
@end
imgUntil.m文件
#import "ImgUntil.h"
#import "UIView+Toast.h"
#import "AFNetworking.h"
#import "XSAPIManager.h"
#import "NetworkConstant.h"
#import "BaseModel.h"
#import "MBProgressHUD.h"
typedef void (^FinishCompressBlock)(UIImage *inFile);//圖片壓縮完成回調 將壓縮后的圖片返回
typedef void (^FinishUploadBlock)(NSString *imgUrl);//圖片上傳單張完成回調 將服務器返回的url存到數組并返回
@implementation ImgUntil
+(void)synUploadAll:(NSMutableArray *)photosArr And:(NSMutableArray *)desturls finish:(FinishUploadAllBlock)finish inController:(UIViewController *)controller{
if (photosArr.count>0) {
UIImage *image = photosArr[0];
[self compress:image finishCompress:^(UIImage *inFile) {//圖片壓縮成功回調處理
[self syncUploadImage:inFile finishUpload:^(NSString *imgUrl) {//圖片上傳成功回調處理
[photosArr removeObjectAtIndex:0];
[desturls addObject:imgUrl];
[self synUploadAll:photosArr And:desturls finish:finish inController:controller];//遞歸 直到數組中的圖片全都上傳完為止
} inController:controller];
}];
}else{
finish(desturls);
}
}
+(void)compress:(UIImage*)image finishCompress:(FinishCompressBlock)compress{
NSData *data= UIImageJPEGRepresentation(image,1);
NSLog(@"圖片大小%lu kb",data.length/1024);
if (data.length > 1024*1024) {//判斷圖片是否大于1M
NSLog(@"正在壓縮圖片");
NSUInteger maxLength = 1024*1024;
UIImage *resultImage = image;
NSData *data = UIImageJPEGRepresentation(resultImage, 1);
NSUInteger lastDataLength = 0;
while (data.length > maxLength && data.length != lastDataLength) {
lastDataLength = data.length;
CGFloat ratio = (CGFloat)maxLength / data.length;
CGSize size = CGSizeMake((NSUInteger)(resultImage.size.width * sqrtf(ratio)),
(NSUInteger)(resultImage.size.height * sqrtf(ratio)));
UIGraphicsBeginImageContext(size);
[resultImage drawInRect:CGRectMake(0, 0, size.width, size.height)];
resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
data = UIImageJPEGRepresentation(resultImage, 1);
NSLog(@"壓縮后圖片大小%lu kb",data.length/1024);
}
compress(resultImage);
}else{
compress(image);
}
}
+(void)syncUploadImage:(UIImage*)image finishUpload:(FinishUploadBlock)upload inController:(UIViewController *)controller{
[MBProgressHUD showHUDAddedTo:controller.view animated:YES];
NSLog(@"正在上傳圖片");
NSString *url = [NSString stringWithFormat:@"%@/images/uploadImgFile",host];
[[XSAPIManager manager] MemberPOST:url requestType:XSRequestTypeJSON parameters:nil constructingBodyWithBlock:^(id formData) {
NSData *data= UIImageJPEGRepresentation(image,1);
[formData appendPartWithFileData:data name:@"file" fileName:@"iosfile.jpg" mimeType:@"image/*"];
} success:^(id responseObject) {
NSLog(@"返回的url %@",responseObject);
BaseModel *model = [BaseModel mj_objectWithKeyValues:responseObject];
if (model.code==1) {
upload(responseObject[@"data"]);
}
[MBProgressHUD hideHUDForView:controller.view animated:YES];
} failure:^(NSError *error) {
[MBProgressHUD hideHUDForView:controller.view animated:YES];
} ];
}
@end
在controller中調用.h文件中的類方法即可。
以上!
總結
以上是生活随笔為你收集整理的ios 上传图片失败 小程序_iOS上传图片,就是有这种不一样的操作!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工业机器人调运角度_工业机器人如何精准选
- 下一篇: dfinity什么时候发币_区块链3.0