一.准备工作
1.上阿里云的网站里下载sdk:网址为:https://help.aliyun.com/document_detail/32060.html?spm=5176.doc32059.6.296.QgohfC。demo地址 https://github.com/aliyun/aliyun-oss-ios-sdk
- 把demo中的AliyunOSSiOS.framework拖入工程
- 导入头文件#import <AliyunOSSiOS/OSSService.h>
- 初始化阿里云@property (strong, nonatomic) OSSClient *client;
二.直接讲解封装好的上传阿里云的文件
1.AliyunOSSUpload.h文件
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#define AliyunUpload [AliyunOSSUpload aliyunInit]
typedef enum{
ENT_fileImageHeader,//头像
ENT_fileImageBody,//个人图片
ENT_fileImageProject,//门店图片
ENT_fileImageJs,//技师展示图片
ENT_fileItemImageBody,//门店项目图片
}FileType;
@interface AliyunOSSUpload : NSObject
+(AliyunOSSUpload *)aliyunInit;
-(void)uploadImage:(NSArray*)imgArr FileDirectory:(FileType)type success:(void (^)(NSString *obj))success;
@end
根据公司需要上面我定义一个枚举,返回不同图片的大小。
2.AliyunOSSUpload.m文件
#import <AliyunOSSiOS/OSSService.h>
#import <AliyunOSSiOS/OSSCompat.h>
#import "AliyunOSSUpload.h"
//#import "NSObject+SBJSON.h"
NSString * const AccessKey = @"***";
NSString * const SecretKey = @"***";
NSString * const endPoint = @"https://oss-cn-qingdao.aliyuncs.com/";
OSSClient * client;
@implementation AliyunOSSUpload
static AliyunOSSUpload *_config;
+(AliyunOSSUpload *)aliyunInit{
@synchronized(self){
if (_config==nil) {
[OSSLog enableLog];
_config=[[AliyunOSSUpload alloc] init];
id<OSSCredentialProvider> credential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:AccessKey
secretKey:SecretKey];
client = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential];
}
}
return _config;
}
-(void)uploadImage:(NSArray*)imgArr FileDirectory:(FileType)type success:(void (^)(NSString *obj))success{
NSMutableArray *imgArray=[NSMutableArray new];
for (int i=0; i<imgArr.count; i++) {
NSData* data;
NSDictionary *imgDictionary = [imgArr objectAtIndex:i];
NSArray *imgValue = [imgDictionary allValues];
NSArray *imgKey = [imgDictionary allKeys];
UIImage *image1 = [imgValue objectAtIndex:0];
NSString *str = [imgKey objectAtIndex:0];
UIImage *image=[IHUtility rotateAndScaleImage:image1 maxResolution:(int)kScreenWidth*2];
OSSPutObjectRequest * put = [OSSPutObjectRequest new];
put.contentType=@"image/jpeg";
put.bucketName = @"yijiao";
NSString *imgName;
if (type==ENT_fileImageHeader) {
NSData *data1=UIImageJPEGRepresentation(image, 1);
float length1 = [data1 length]/1024;
if (length1<600) {
data = UIImageJPEGRepresentation(image, 1);
}else{
if ([IHUtility IsEnableWIFI]) {
data = UIImageJPEGRepresentation(image, 0.6);
}else{
data = UIImageJPEGRepresentation(image, 0.5);
}
}
imgName=[NSString stringWithFormat:@"ios/header/header_%@.jpg",[IHUtility getTransactionID]];
}else if (type==ENT_fileImageBody){
NSData *data1=UIImageJPEGRepresentation(image, 1);
float length1 = [data1 length]/1024;
if (length1<600) {
data = UIImageJPEGRepresentation(image, 1);
}else{
data = UIImageJPEGRepresentation(image, 0.5);
}
imgName=[NSString stringWithFormat:@"ios/content/body_%@/%@.jpg",str,[IHUtility getNowTimeTimestamp]];
}else if (type==ENT_fileImageJs)
{
NSData *data1=UIImageJPEGRepresentation(image, 1);
float length1 = [data1 length]/1024;
if (length1<600) {
data = UIImageJPEGRepresentation(image, 1);
}else{
data = UIImageJPEGRepresentation(image, 0.5);
}
imgName=[NSString stringWithFormat:@"js/header/header_%@.jpg",[IHUtility getTransactionID]];
}else if (type==ENT_fileImageProject){
NSData *data1=UIImageJPEGRepresentation(image, 1);
float length1 = [data1 length]/1024;
if (length1<600) {
data = UIImageJPEGRepresentation(image, 1);
}else{
data = UIImageJPEGRepresentation(image, 0.5);
}
imgName=[NSString stringWithFormat:@"ios/storePicture/web_%@/%@.jpg",str,[IHUtility getNowTimeTimestamp]];
}else if (type==ENT_fileItemImageBody){
NSData *data1=UIImageJPEGRepresentation(image, 1);
float length1 = [data1 length]/1024;
if (length1<600) {
data = UIImageJPEGRepresentation(image, 1);
}else{
data = UIImageJPEGRepresentation(image, 0.5);
}
imgName=[NSString stringWithFormat:@"ios/web/itemBody_%@/%@.jpg",str,[IHUtility getNowTimeTimestamp]];
}
put.objectKey = imgName;
put.uploadingData = data; // 直接上传NSData
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
};
NSString *imgWidth;
NSString *imgHeigh;
if (type==ENT_fileImageHeader) {
imgWidth=[NSString stringWithFormat:@"%d",(int)kScreenWidth];
imgHeigh=[NSString stringWithFormat:@"%d",(int)kScreenWidth];
}
else if (type==ENT_fileImageBody){
imgWidth=[NSString stringWithFormat:@"%lf",image.size.width];
imgHeigh=[NSString stringWithFormat:@"%lf",image.size.height];
} else if (type==ENT_fileImageJs){
imgWidth=[NSString stringWithFormat:@"%lf",image.size.width];
imgHeigh=[NSString stringWithFormat:@"%lf",image.size.height];
}else if (type==ENT_fileImageProject){
imgWidth=[NSString stringWithFormat:@"%lf",image.size.width];
imgHeigh=[NSString stringWithFormat:@"%lf",image.size.height];
}else if (type==ENT_fileItemImageBody){
imgWidth=[NSString stringWithFormat:@"%lf",image.size.width];
imgHeigh=[NSString stringWithFormat:@"%lf",image.size.height];
}
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"/%@",imgName],@"t_url",
imgWidth,@"t_width",
imgHeigh,@"t_height",
nil];
[imgArray addObject:dic];
if (client==nil) {
id<OSSCredentialProvider> credential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:AccessKey
secretKey:SecretKey];
client = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential];
}
OSSTask * putTask = [client putObject:put];
[putTask continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"upload object success!");
if (type==ENT_fileImageHeader) {
NSString *str=[NSString stringWithFormat:@"/%@",imgName];
success(str);
}
else if (type==ENT_fileImageBody){
if (i==imgArr.count-1) {
NSString *str=[imgArray JSONRepresentation];
success(str);
}
}else if (type==ENT_fileImageJs){
success(imgName);
}
else if (type==ENT_fileImageProject){
if (i==imgArr.count-1) {
NSString *str=[imgArray JSONRepresentation];
success(str);
}
}else if (type==ENT_fileItemImageBody){
success(imgName);
}
} else{
[YJTipView showBottomWithText:@"图片上传失败,请重试" bottomOffset:300 duration:1.5f];
NSLog(@"upload object failed, error: %@" , task.error);
}
return nil;
}];
}
}
想上传到阿里,首先要有对应的阿里的账号参数,填写到这里
NSString * const AccessKey = @"";
NSString * const SecretKey = @"";
OSSClient是OSS服务的iOS客户端,它为调用者提供了一系列的方法,用于和OSS服务进行交互。一般来说,全局内只需要保持一个OSSClient,用来调用各种操作。
Bucket名称, Object名称
put.bucketName = @"自己的数据";
put.objectKey = @"自己的数据";
data上传
put.uploadingData = self.imageData;//自己的NSData数据
上传的时候你也可以看一看你的上传进度,还有一些参数配置
put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
//当前上传段长度、当前已经上传总长度、一共需要上传的总长度
};
我没有按照官方说的加上这句:
task = [client presignPublicURLWithBucketName:@"同上面的bucketName"
withObjectKey:同上];
因为上传阿里云的时候,上传的图片命名不能相同,所以利用了随机数,和时间戳的方法
随机数方法:
//随机数
+ (NSString*)getTransactionID
{
NSDate* date = [NSDate date];
NSMutableString* strDate = [NSMutableString stringWithFormat:@"%@", date];
NSString *s1=[strDate stringByReplacingOccurrencesOfString:@"-" withString:@""];
NSString *s2= [s1 stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString *s3= [s2 stringByReplacingOccurrencesOfString:@":" withString:@""];
int n = (arc4random() % 9000) + 1000;
NSMutableString* transactionID = [NSMutableString stringWithString:[s3 substringToIndex:14]];
[transactionID appendString:[NSString stringWithFormat:@"%d", n]];
[transactionID stringByReplacingOccurrencesOfString:@" " withString:@""];
return transactionID;
}
时间戳方法:
//获取当前时间戳
+(NSString *)getNowTimeTimestamp{
NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];
NSTimeInterval a=[dat timeIntervalSince1970];
NSString*timeString = [NSString stringWithFormat:@"%0.f", a];//转为字符型
return timeString;
}
三.在调用相册的地方引用方法
[AliyunUpload uploadImage:headImageArray FileDirectory:ENT_fileItemImageBody success:^(NSString *obj) {
_pictureStr =obj ;//就是上传后的名称
dispatch_sync(dispatch_get_main_queue(), ^{
});
}];
最后:奉献上我的demo(https://github.com/dt8888/TestView),有不足的地方,随时指教。
网友评论