iOS 图片上传的两种方式

我们在写代码的时候经常会将头像进行上传服务器,上传头像图片我试过两种方式

一种方式就是使用base64字符串上传图片,这种形式我个人认为比较适合上传图片数量比较少的,比如上传头像,上传图片数量多的话,速度会慢些

另一种方式是使用二进制流进行上传图片,这种方式上传图片少或者数量多都没关系,速度也很快

demo地址: https://github.com/tuwanli/PictureHead

选择头像效果:



程序如下:

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : 
UIViewController

@property (weak, 
nonatomic) IBOutlet
UIImageView *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 {

[super
viewDidLoad];

//初始化头像控件

[self
initHeadIcon];

//初始化pickController

[self
createData];
}
- (void)initHeadIcon
{

self.view.backgroundColor = [UIColor
lightGrayColor];

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 = [[UIImagePickerController
alloc]init];

pickerController.view.backgroundColor = [UIColor
orangeColor];

pickerController.delegate =
self;

pickerController.allowsEditing =
YES;
}

- (IBAction)changeIconAction:(UITapGestureRecognizer *)sender {

UIActionSheet *actionSheet = [[UIActionSheet
alloc]initWithTitle:@"选择头像"
delegate:self
cancelButtonTitle:@"取消"
destructiveButtonTitle:nil
otherButtonTitles:@"拍照",@"相册",@"图库",
nil];

[actionSheet showInView:[UIApplication
sharedApplication].keyWindow];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{

if (buttonIndex == 
0) {//相机

if([UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{

NSLog(@"支持相机");
[self
makePhoto];
}else{

UIAlertView *alert = [[UIAlertView
alloc]initWithTitle:@"提示"
message:@"请在设置-->隐私-->相机,中开启本应用的相机访问权限!!"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"我知道了",
nil];
[alert
show];
}
}else
if (buttonIndex == 
1){//相片

if([UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
{

NSLog(@"支持相册");
[self
choosePicture];
}else{

UIAlertView *alert = [[UIAlertView
alloc]initWithTitle:@"提示"
message:@"请在设置-->隐私-->照片,中开启本应用的相机访问权限!!"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"我知道了",
nil];
[alert
show];
}
}else
if (buttonIndex == 
2){//图册

if ([UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{

NSLog(@"支持图库");
[self
pictureLibrary];

// [self presentViewController:picker animated:YES completion:nil];
}else{

UIAlertView *alert = [[UIAlertView
alloc]initWithTitle:@"提示"
message:@"请在设置-->隐私-->照片,中开启本应用的相机访问权限!!"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"我知道了",
nil];
[alert
show];
}
}else
if (buttonIndex == 
3){


}

}

//跳转到imagePicker里
- (void)makePhoto
{

pickerController.sourceType =
UIImagePickerControllerSourceTypeCamera;

[self
presentViewController:pickerController
animated:YES
completion:nil];
}

//跳转到相册
- (void)choosePicture
{

pickerController.sourceType =
UIImagePickerControllerSourceTypeSavedPhotosAlbum;

[self
presentViewController:pickerController
animated:YES
completion:nil];
}

//跳转图库
- (void)pictureLibrary
{

pickerController.sourceType =
UIImagePickerControllerSourceTypePhotoLibrary;

[self
presentViewController:pickerController
animated:YES
completion:nil];
}

//用户取消退出picker时候调用
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{

NSLog(@"%@",picker);

[pickerController
dismissViewControllerAnimated:YES
completion:^{


}];
}

//用户选中图片之后的回调
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary
*)info
{



NSLog(@"%s,info == %@",__func__,info);



UIImage *userImage = [self
fixOrientation:[info
objectForKey:@"UIImagePickerControllerOriginalImage"]];


userImage = [self
scaleImage:userImage 
toScale:0.3];



//保存图片

// [self saveImage:userImage name:@"某个特定标示"];



[pickerController
dismissViewControllerAnimated:YES
completion:^{




}];
[self.headIcon
setImage:userImage];

self.headIcon.contentMode
= UIViewContentModeScaleAspectFill;

self.headIcon.clipsToBounds =
YES;

//照片上传
[self
upDateHeadIcon:userImage];
}

- (void)upDateHeadIcon:(UIImage *)photo
{

//两种方式上传头像

/*方式一:使用NSData数据流传图片*/

NSString *imageURl = 
@"";

manager.responseSerializer = [AFHTTPResponseSerializer
serializer];



manager.responseSerializer.acceptableContentTypes =[NSSet
setWithObject:@"text/html"];

[manager
POST:imageURl parameters:nil
constructingBodyWithBlock:^(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=[data 
base64Encoding];

NSDictionary * dic =
@{@"verbId":@"modifyUserInfo",@"deviceType":@"ios",@"userId":@"",@"photo":pictureDataString,@"mobileTel":@""};
[manager
POST:@"" 
parameters:dic success:^(AFHTTPRequestOperation *operation,
id responseObject) {

if ([[responseObject 
objectForKey:@"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 = [[paths
objectAtIndex:0]
stringByAppendingPathComponent:[NSString
stringWithFormat:@"%@.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));
[image
drawInRect:CGRectMake(0,
0, image.size.width * scaleSize, image.size.height *scaleSize)];

UIImage *scaledImage =
UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

NSLog(@"%@",NSStringFromCGSize(scaledImage.size));

return scaledImage;
}

//修正照片方向(手机转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) {

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:

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 = [UIImage
imageWithCGImage:cgimg];

CGContextRelease(ctx);

CGImageRelease(cgimg);

return img;
}

猜你喜欢

转载自blog.csdn.net/love_coders/article/details/51313198