上传头像这一步几乎在所有的应用中都会用到,但是博主发现即使是那些工作一年甚至两年的开发者依然会问这个问题,更别提那些初学者了,虽然网上能找到好多种上传的方法,但是都存在不同程度的误差,要么是不够详细,要么是运行出错,所以博主今天就把自己常用的一种方法拿出来给大家分享一下。

首先说明下:博主上传采用的是AF3.0,因为博主去掉了项目中的接口,所以,这个Demo中是不能上传成功的,但是效果会有,看官们只需要把自己的url放进去就可以实现上传了。具体的跟着博主慢慢往下看:

第一步:触发操作

  //根据警告知道这个对象在iOS8.3被废弃了,只是依然可以用,在下篇博客中,会针对废弃后的提供的新方法做介绍和使用UIActionSheet * actionSheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Take photos", @"Select picture in phone album",nil];actionSheet.delegate=self;actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;[actionSheet showInView:self.view];

第二步:选择相册或直接拍照

#pragma mark - 选择手机拍照上传或者手机相册上传
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{if (buttonIndex==1) {UIImagePickerController *picker = [[UIImagePickerController alloc] init];picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;picker.delegate = self;//设置选择后的图片可被编辑picker.allowsEditing = YES;[self presentViewController:picker animated:YES completion:nil];}if (buttonIndex==0) {UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]){UIImagePickerController *picker = [[UIImagePickerController alloc] init];picker.delegate = self;//设置拍照后的图片可被编辑picker.allowsEditing = YES;picker.sourceType = sourceType;[self presentViewController:picker animated:YES completion:nil];}else{UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"警告" message:@"请使用真机进行测试" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];[alertView show];NSLog(@"模拟其中无法打开照相机,请在真机中使用");}}
}

第三步:选择一张图片后

#pragma mark - 当在相册选择一张图片后进入这里
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{NSString *type = [info objectForKey:UIImagePickerControllerMediaType];//当选择的类型是图片if ([type isEqualToString:@"public.image"]){//先把图片转成NSDataUIImage* image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];//调整图片方向,防止上传后图片方向不对[self fixOrientation:image];//压缩图片NSData *data = UIImageJPEGRepresentation(image, 0.5);//图片保存的路径//这里将图片放在沙盒的documents文件夹中NSString * DocumentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];NSLog(@"图片储存路径:%@",DocumentsPath);//文件管理器NSFileManager *fileManager = [NSFileManager defaultManager];//把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png[fileManager createDirectoryAtPath:DocumentsPath withIntermediateDirectories:YES attributes:nil error:nil];[fileManager createFileAtPath:[DocumentsPath stringByAppendingString:@"/image.png"] contents:data attributes:nil];//得到选择后沙盒中图片的完整路径NSString *filePath = [[NSString alloc]initWithFormat:@"%@%@",DocumentsPath,@"/image.png"];NSLog(@"................%@",filePath);//表单请求,上传文件AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];manager.requestSerializer = [AFJSONRequestSerializer serializer];//请求manager.responseSerializer = [AFHTTPResponseSerializer serializer];//响应manager.requestSerializer.timeoutInterval = 8;/**这里需要特别注意一下,因为没有放具体的上传地址,所以这个上传方式是不成功的,但是方法是没错的,需要替换成正确的上传地址*/[manager POST:[NSString stringWithFormat:@"url"] parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {//将图片以表单形式上传NSData *data1=[NSData dataWithContentsOfFile:filePath];[formData appendPartWithFileData:data1 name:@"headPicFile" fileName:@"headPicFile" mimeType:@"image/png"];//关闭相册界面[picker dismissViewControllerAnimated:YES completion:nil];}progress:^(NSProgress *uploadProgress){}success:^(NSURLSessionDataTask *task, id responseObject) {NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];NSLog(@"dic:%@",dic);//成功后替换新头像NSData *data1=[NSData dataWithContentsOfFile:filePath];headImageView.image = [UIImage imageWithData:data1];} failure:^(NSURLSessionDataTask *task, NSError *error) {NSLog(@"%@",[error description]);NSLog(@"%@",error);//因为没有有效地址,所以肯定是上传失败的,为了表现出效果,此处也替换为新头像NSData *data1=[NSData dataWithContentsOfFile:filePath];headImageView.image = [UIImage imageWithData:data1];}];}}

注释比较详细,应该都能看懂吧。在这一步直接就上传成功了。
第四步:矫正图片方向,这一步和第三步息息相关,在第三部中调用

- (UIImage *)fixOrientation:(UIImage *)aImage {// No-op if the orientation is already correctif (aImage.imageOrientation == UIImageOrientationUp)return aImage;// We need to calculate the proper transformation to make the image upright.// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.CGAffineTransform transform = CGAffineTransformIdentity;switch (aImage.imageOrientation) {case UIImageOrientationDown:case UIImageOrientationDownMirrored:transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);transform = CGAffineTransformRotate(transform, M_PI);break;case UIImageOrientationLeft:case UIImageOrientationLeftMirrored:transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);transform = CGAffineTransformRotate(transform, M_PI_2);break;case UIImageOrientationRight:case UIImageOrientationRightMirrored:transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);transform = CGAffineTransformRotate(transform, -M_PI_2);break;default:break;}switch (aImage.imageOrientation) {case UIImageOrientationUpMirrored:case UIImageOrientationDownMirrored:transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);transform = CGAffineTransformScale(transform, -1, 1);break;case UIImageOrientationLeftMirrored:case UIImageOrientationRightMirrored: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) {case UIImageOrientationLeft:case UIImageOrientationLeftMirrored:case UIImageOrientationRight:case UIImageOrientationRightMirrored:// Grr...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;}// And now we just create a new UIImage from the drawing contextCGImageRef cgimg = CGBitmapContextCreateImage(ctx);UIImage *img = [UIImage imageWithCGImage:cgimg];CGContextRelease(ctx);CGImageRelease(cgimg);return img;
}

图片矫正位置,虽然大家不熟悉上面的代码,但是看代码也能看看明白是在做什么,目前是为了实现功能,不必深究,想了解的请自行查找资料。

第五步:点击取消后,返回原来的界面

#pragma mark - 取消图片选择
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{NSLog(@"您取消了选择图片");[picker dismissViewControllerAnimated:YES completion:nil];}

以上五步就完成了头像的上传。
这里再说一个小知识,也是博主早前在把图片变为圆时发现的,layer.cornerRadius,怎么设置这个值才能让图片为圆呢?一般很多人都会一个个试,直到无限接近圆,这里博主告诉大家一个小方法,一般来说头像的图片都是正方形,即使是矩形也要截取的,这里以正方形为例,只需要设置cornerRadius为正方形长的一半,就好像内切圆的半径一样,矩形的话类似,设置短边的一半即可。

最后放上Demo的下载地址:https://github.com/codeliu6572/UploadHeadImage

一步步教你如何上传头像相关推荐

  1. Swift-一步步教你上传头像

    先前有人私信我说上传有问题,博主确认了下,发现是路径的问题,把Object-C的代码转变成Swift后路径就出了问题,不知道原因,推测可能是Swift本身的问题,所以博主换了一种路径方式,大家注意,关 ...

  2. 高手教你PHP上传多张图片

    高手教你PHP上传多张图片 对于我们来说上传一张图片是非常简单的事情,这里教大家一个关于PHP上传多张图片的代码分析,希望对大家有帮助. 学习PHP时,你可能会遇到PHP上传多张图片问题,这里将介绍P ...

  3. js 上传头像img

    <label><div class="myusercenter-image-none"><img src="" class=&qu ...

  4. php上传头像的代码,php头像上传预览实例代码

    说道上传图片,大家并不陌生,不过,在以后开发的项目中,可能并不会让你使用提交刷新页面式的上传图片,比如上传头像,按照常理,肯定是在相册选择照片之后,确认上传,而肯定不会通过form表单,点击submi ...

  5. 上传头像,layui上传图片

    layui上传与bootstrap上传相似,只是不需要下插件, layui自带的已够用 先看一下前台界面,这里是用到的上传头像 先点击开始上传,头像上传至服务器中, 返回json添加至form表单中, ...

  6. ASP.NET MVC3 上传头像图片并截图

    关于上传头像并且截图网上应该有很多资料,大多都是JQuery插件,用起来不是很方便 本文所介绍的方法将快速完成一个"上传头像图片并截图",只需要修改少量的代码 我们先来看看完成后的 ...

  7. php拍视频上传,php视频拍照上传头像功能实现代码分享

    现在手机拍照很火,那么如何使用手机拍照并上传头像呢?原因很简单,就是数据传递,首先手机传递照片信息,既不是post传递也不是get函数传递,这个另外一种数据 如果要在php中实现视频拍照我们需要借助于 ...

  8. Django搭建个人博客:上传头像图片

    到目前为止我们的博客处理的都是文字.现代互联网早就进入了"读图"时代,图片的维护.展示也就相当重要. 上一章中预留了avatar字段,用来保存用户上传的头像,现在我们来实现这个功能 ...

  9. axios获取图片显示_vue中使用axios post上传头像/图片并实时显示到页面的方法

    在前端开发中,为了更好的用户体验,在头像上传时会先将图片显示到页面然后点击保存按钮 完成图片的上传成功 代码部分有参考他人的写法. html代码: 请上传图片 js代码: //实时显示该图片在页面 g ...

最新文章

  1. 布朗大学研究者提出面向下一代脑机接口系统
  2. javascript :得到上星期的这一天日期
  3. jzoj2755-[2012东莞市选]树的计数【dp,高精度】
  4. Cloud一分钟 | 华为云、腾讯云、阿里云中标「央视2018年租赁公有云服务」项目...
  5. android androidruntime java,java – Runtime.exec():在Android中重启?
  6. JavaScript事件基础知识总结【思维导图】
  7. 小米8劲敌来了!同是骁龙845,它降价幅度更大
  8. 穿越沙漠问题c语言算法,沙漠穿越问题_c语言课程设计.doc
  9. win7设置动态桌面,将视频设为桌面
  10. SiamFC 学习(论文、总结与分析)
  11. zk集群和clickhouse集群搭建
  12. 背包问题(Knapsack Problem) ----- 蛮力法
  13. python 实现 加减乘除,对数指数,三角反三角计算器
  14. python汉语词频统计_Python之四大名著汉字词频统计
  15. 用户行为分析的指标体系
  16. JBOSS启动错误:Not pointing to a directory
  17. U盘内存卡数据丢失怎么恢复,这样操作也可以
  18. 分享8个超好用的免费工具/软件/网站(一定有你要的)
  19. 【STM32】在Keil上使用C++编程
  20. 20220530数据结构绿皮书读书笔记

热门文章

  1. Mac下载Navicat premium提示文件损坏的解决方案
  2. 虚拟机的资源分配策略
  3. vm眼影真的好用吗_便宜的眼影盘有什么坏处?
  4. 关于ajax同步异步处理循环遍历及push时发生的疑问
  5. Android开发者指南(1) —— Android Debug Bridge(adb)
  6. swift03答题app
  7. Wax 将Lua带人iPhone开发
  8. div写input多选时间段标签,layui选择时间段
  9. 出行领域成侵害用户权益重灾区,星星充电上市进程或添阻
  10. 微软预科生计划skype在线面试题