iOS 圖片上傳使用base64或者二進(jìn)制流上傳頭像功能
我們?cè)趯懘a的時(shí)候經(jīng)常會(huì)將頭像進(jìn)行上傳服務(wù)器,上傳頭像圖片我試過(guò)兩種方式
一種方式就是使用base64字符串上傳圖片,這種形式我個(gè)人認(rèn)為比較適合上傳圖片數(shù)量比較少的,比如上傳頭像,上傳圖片數(shù)量多的話,速度會(huì)慢些
另一種方式是使用二進(jìn)制流進(jìn)行上傳圖片,這種方式上傳圖片少或者數(shù)量多都沒(méi)關(guān)系,速度也很快
demo地址:http://download.csdn.net/detail/tuwanli125/9340205
demo地址: https://github.com/tuwanli/PictureHead
選擇頭像效果:
程序如下:
ViewController.h
#import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutletUIImageView *headIcon; - (IBAction)changeIconAction:(UITapGestureRecognizer *)sender; @end
ViewController.m
#import "ViewController.h" #import "AFHTTPRequestOperationManager.h" @interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIActionSheetDelegate> { UIImagePickerController *pickerController; AFHTTPRequestOperationManager *manager; } @end @implementation ViewController - (void)viewDidLoad { [superviewDidLoad]; //初始化頭像控件 [selfinitHeadIcon]; //初始化pickController [selfcreateData]; } - (void)initHeadIcon { self.view.backgroundColor = [UIColorlightGrayColor]; self.headIcon.layer.cornerRadius = self.headIcon.frame.size.height/2; self.headIcon.clipsToBounds =YES; self.headIcon.layer.borderColor = [UIColor whiteColor].CGColor; self.headIcon.layer.borderWidth = 3; } - (void)createData { //初始化pickerController pickerController = [[UIImagePickerControlleralloc]init]; pickerController.view.backgroundColor = [UIColororangeColor]; pickerController.delegate =self; pickerController.allowsEditing =YES; } - (IBAction)changeIconAction:(UITapGestureRecognizer *)sender { UIActionSheet *actionSheet = [[UIActionSheetalloc]initWithTitle:@"選擇頭像"delegate:selfcancelButtonTitle:@"取消"destructiveButtonTitle:nilotherButtonTitles:@"拍照",@"相冊(cè)",@"圖庫(kù)",nil]; [actionSheet showInView:[UIApplicationsharedApplication].keyWindow]; } - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex ==0) {//相機(jī) if([UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { NSLog(@"支持相機(jī)"); [selfmakePhoto]; }else{ UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"提示"message:@"請(qǐng)?jiān)谠O(shè)置-->隱私-->相機(jī),中開啟本應(yīng)用的相機(jī)訪問(wèn)權(quán)限!!"delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"我知道了",nil]; [alertshow]; } }elseif (buttonIndex ==1){//相片 if([UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { NSLog(@"支持相冊(cè)"); [selfchoosePicture]; }else{ UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"提示"message:@"請(qǐng)?jiān)谠O(shè)置-->隱私-->照片,中開啟本應(yīng)用的相機(jī)訪問(wèn)權(quán)限?。?delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"我知道了",nil]; [alertshow]; } }elseif (buttonIndex ==2){//圖冊(cè) if([UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum]) { NSLog(@"支持圖庫(kù)"); [selfpictureLibrary]; // [self presentViewController:picker animated:YES completion:nil]; }else{ UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"提示"message:@"請(qǐng)?jiān)谠O(shè)置-->隱私-->照片,中開啟本應(yīng)用的相機(jī)訪問(wèn)權(quán)限??!"delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"我知道了",nil]; [alertshow]; } }elseif (buttonIndex ==3){ } } //跳轉(zhuǎn)到imagePicker里 - (void)makePhoto { pickerController.sourceType =UIImagePickerControllerSourceTypeCamera; [selfpresentViewController:pickerControlleranimated:YEScompletion:nil]; } //跳轉(zhuǎn)到相冊(cè) - (void)choosePicture { pickerController.sourceType =UIImagePickerControllerSourceTypeSavedPhotosAlbum; [selfpresentViewController:pickerControlleranimated:YEScompletion:nil]; } //跳轉(zhuǎn)圖庫(kù) - (void)pictureLibrary { pickerController.sourceType =UIImagePickerControllerSourceTypePhotoLibrary; [selfpresentViewController:pickerControlleranimated:YEScompletion:nil]; } //用戶取消退出picker時(shí)候調(diào)用 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { NSLog(@"%@",picker); [pickerControllerdismissViewControllerAnimated:YEScompletion:^{ }]; } //用戶選中圖片之后的回調(diào) - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { NSLog(@"%s,info == %@",__func__,info); UIImage *userImage = [selffixOrientation:[infoobjectForKey:@"UIImagePickerControllerOriginalImage"]]; userImage = [selfscaleImage:userImagetoScale:0.3]; //保存圖片 // [self saveImage:userImage name:@"某個(gè)特定標(biāo)示"]; [pickerControllerdismissViewControllerAnimated:YEScompletion:^{ }]; [self.headIconsetImage:userImage]; self.headIcon.contentMode = UIViewContentModeScaleAspectFill; self.headIcon.clipsToBounds =YES; //照片上傳 [selfupDateHeadIcon:userImage]; } - (void)upDateHeadIcon:(UIImage *)photo { //兩種方式上傳頭像 /*方式一:使用NSData數(shù)據(jù)流傳圖片*/ NSString *imageURl =@""; manager.responseSerializer = [AFHTTPResponseSerializerserializer]; manager.responseSerializer.acceptableContentTypes =[NSSetsetWithObject:@"text/html"]; [managerPOST:imageURlparameters:nilconstructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:UIImageJPEGRepresentation(photo,1.0)name:@"text"fileName:@"test.jpg"mimeType:@"image/jpg"]; }success:^(AFHTTPRequestOperation *operation,id responseObject) { }failure:^(AFHTTPRequestOperation *operation,NSError *error) { }]; /*方式二:使用Base64字符串傳圖片*/ NSData *data =UIImageJPEGRepresentation(photo,1.0); NSString *pictureDataString=[database64Encoding]; NSDictionary * dic =@{@"verbId":@"modifyUserInfo",@"deviceType":@"ios",@"userId":@"",@"photo":pictureDataString,@"mobileTel":@""}; [managerPOST:@""parameters:dic success:^(AFHTTPRequestOperation *operation,idresponseObject) { if ([[responseObjectobjectForKey:@"flag"]intValue] == 0) { }else{ } } failure:^(AFHTTPRequestOperation *operation,NSError *error) { }]; } //保存照片到沙盒路徑(保存) - (void)saveImage:(UIImage *)image name:(NSString *)iconName { NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); //寫入文件 NSString *icomImage = iconName; NSString *filePath = [[pathsobjectAtIndex:0]stringByAppendingPathComponent:[NSStringstringWithFormat:@"%@.png", icomImage]]; // 保存文件的名稱 // [[self getDataByImage:image] writeToFile:filePath atomically:YES]; [UIImagePNGRepresentation(image)writeToFile: filePath atomically:YES]; } //縮放圖片 - (UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize { UIGraphicsBeginImageContext(CGSizeMake(image.size.width*scaleSize,image.size.height*scaleSize)); [imagedrawInRect:CGRectMake(0,0, image.size.width * scaleSize, image.size.height *scaleSize)]; UIImage *scaledImage =UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSLog(@"%@",NSStringFromCGSize(scaledImage.size)); return scaledImage; } //修正照片方向(手機(jī)轉(zhuǎn)90度方向拍照) - (UIImage *)fixOrientation:(UIImage *)aImage { // No-op if the orientation is already correct if (aImage.imageOrientation ==UIImageOrientationUp) return aImage; CGAffineTransform transform =CGAffineTransformIdentity; switch (aImage.imageOrientation) { caseUIImageOrientationDown: caseUIImageOrientationDownMirrored: transform =CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height); transform =CGAffineTransformRotate(transform,M_PI); break; caseUIImageOrientationLeft: caseUIImageOrientationLeftMirrored: transform =CGAffineTransformTranslate(transform, aImage.size.width,0); transform =CGAffineTransformRotate(transform,M_PI_2); break; caseUIImageOrientationRight: caseUIImageOrientationRightMirrored: transform =CGAffineTransformTranslate(transform,0, aImage.size.height); transform =CGAffineTransformRotate(transform, -M_PI_2); break; default: break; } switch (aImage.imageOrientation) { caseUIImageOrientationUpMirrored: caseUIImageOrientationDownMirrored: transform =CGAffineTransformTranslate(transform, aImage.size.width,0); transform =CGAffineTransformScale(transform, -1,1); break; caseUIImageOrientationLeftMirrored: caseUIImageOrientationRightMirrored: transform =CGAffineTransformTranslate(transform, aImage.size.height,0); transform =CGAffineTransformScale(transform, -1,1); break; default: break; } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. CGContextRef ctx =CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height, CGImageGetBitsPerComponent(aImage.CGImage),0, CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage)); CGContextConcatCTM(ctx, transform); switch (aImage.imageOrientation) { caseUIImageOrientationLeft: caseUIImageOrientationLeftMirrored: caseUIImageOrientationRight: caseUIImageOrientationRightMirrored: CGContextDrawImage(ctx,CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage); break; default: CGContextDrawImage(ctx,CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage); break; } CGImageRef cgimg =CGBitmapContextCreateImage(ctx); UIImage *img = [UIImageimageWithCGImage:cgimg]; CGContextRelease(ctx); CGImageRelease(cgimg); return img; }
此demo從相冊(cè)選區(qū)圖片使用的單選圖片,如果想看多選圖片顯示在ScrollView中demo 地址:
https://github.com/tuwanli/PictureMutipleSelect
總結(jié)
以上所述是小編給大家介紹的iOS 圖片上傳使用base64或者二進(jìn)制流上傳頭像功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
IOS開發(fā)代碼分享之設(shè)置UISearchBar的背景顏色
在項(xiàng)目開發(fā)中,我們經(jīng)常要用到UISearchBar,在網(wǎng)上看到了很多關(guān)于去除掉他背景色的方法,都已經(jīng)失效了,今天來(lái)分享一個(gè)正常使用的方法,希望能幫到大家2014-09-09ios12中遇到的帶input彈窗的錯(cuò)位問(wèn)題的解決方法
這篇文章主要介紹了ios12中遇到的帶input彈窗的錯(cuò)位問(wèn)題的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05iOS應(yīng)用內(nèi)實(shí)現(xiàn)跳轉(zhuǎn)到手機(jī)淘寶天貓的方法
這篇文章主要給大家介紹了關(guān)于iOS應(yīng)用內(nèi)如何實(shí)現(xiàn)跳轉(zhuǎn)到手機(jī)淘寶天貓的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12iOS動(dòng)畫解析之圓球加載動(dòng)畫XLBallLoading的實(shí)現(xiàn)
加載動(dòng)畫對(duì)大家來(lái)說(shuō)都不陌生,我們?cè)谄綍r(shí)都會(huì)遇見,開發(fā)中也必不可少,所以下面這篇文章主要給大家介紹了關(guān)于iOS動(dòng)畫解析之圓球加載動(dòng)畫XLBallLoading實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11iOS動(dòng)態(tài)驗(yàn)證碼實(shí)現(xiàn)代碼
本文通過(guò)實(shí)例代碼給大家介紹了ios動(dòng)態(tài)驗(yàn)證碼的實(shí)現(xiàn)方法,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-04-04