iOS OSS上传图片工具类封装

1、OSS连接官方连接

2、下载SDK:

通过GitHub下载
pod依赖: pod 'AliyunOSSiOS'
demo地址: https://github.com/aliyun/aliyun-oss-ios-sdk

3、创建一个类
在这里插入图片描述
4、.h文件属性方法:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

typedef NS_ENUM(NSInteger, UploadImageState) {
    UploadImageFailed   = 0,
    UploadImageSuccess  = 1
};
// 当前上传段长度、当前已经上传总长度、一共需要上传的总长度
typedef void(^HBUploadImageManageProgressBlock)(int64_t bytesSent, int64_t totalByteSent ,int64_t totalBytesExpectedToSend);

@interface HBUploadImageManage : NSObject

+ (void)asyncUploadImage:(UIImage *)image tempImgFolder:(NSString *)TempImgFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names,UploadImageState state))complete;

+ (void)syncUploadImage:(UIImage *)image tempImgFolder:(NSString *)TempImgFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names,UploadImageState state))complete;

+ (void)asyncUploadImages:(NSArray<UIImage *> *)images tempImgFolder:(NSString *)TempImgFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete;

+ (void)syncUploadImages:(NSArray<UIImage *> *)images tempImgFolder:(NSString *)TempImgFolder  progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete;
//上传视频
+ (void)asyncUploadVideo:(NSData *)data tempVideoFolder:(NSString *)TempVideoFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete;
+ (void)syncUploadVideo:(NSData *)data tempVideoFolder:(NSString *)TempVideoFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete;
@end

5、.m文件属性方法

#import "HBUploadImageManage.h"
#import <AliyunOSSiOS/OSSService.h>
@implementation HBUploadImageManage
//需要的一些基本信息
static NSString *const AccessKey = @"";
static NSString *const SecretKey = @"";
static NSString *const BucketName = @"";
static NSString *const AliYunHost = @"";
//static NSString *const AliYunHost = @"";
//static NSString *kTempImgFolder = @"ios/img";
//static NSString *kTempVideoFolder = @"ios/video";
static NSString *rootUrl = @"";


+ (void)asyncUploadImage:(UIImage *)image tempImgFolder:(NSString *)TempImgFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names,UploadImageState state))complete
{
    [self uploadImages:@[image] tempImgFolder:TempImgFolder isAsync:YES progress:progressBlock complete:complete];
}

+ (void)syncUploadImage:(UIImage *)image tempImgFolder:(NSString *)TempImgFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names,UploadImageState state))complete
{
    [self uploadImages:@[image] tempImgFolder:TempImgFolder isAsync:NO progress:progressBlock complete:complete];
}

+ (void)asyncUploadImages:(NSArray<UIImage *> *)images tempImgFolder:(NSString *)TempImgFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete
{
    [self uploadImages:images tempImgFolder:TempImgFolder isAsync:YES progress:progressBlock complete:complete];
}

+ (void)syncUploadImages:(NSArray<UIImage *> *)images tempImgFolder:(NSString *)TempImgFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete
{
    [self uploadImages:images tempImgFolder:TempImgFolder isAsync:NO progress:progressBlock complete:complete];
}

+ (void)uploadImages:(NSArray<UIImage *> *)images tempImgFolder:(NSString *)TempImgFolder isAsync:(BOOL)isAsync  progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete
{
    id<OSSCredentialProvider> credential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:AccessKey                                                                                                            secretKey:SecretKey];
    
    OSSClient *client = [[OSSClient alloc] initWithEndpoint:AliYunHost credentialProvider:credential];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    queue.maxConcurrentOperationCount = images.count;
    
    NSMutableArray *callBackNames = [NSMutableArray array];
    int i = 0;
    for (UIImage *image in images) {
        if (image) {
            NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
                //任务执行
                OSSPutObjectRequest * put = [OSSPutObjectRequest new];
                put.bucketName = BucketName;
                put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
                    // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度
                    NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
                    if (progressBlock) {
                        progressBlock(bytesSent,totalByteSent,totalBytesExpectedToSend);
                    }
                };
                //文件路径及名称拼接
                NSString *imageName = [TempImgFolder stringByAppendingPathComponent:[[HBHuTool imgAndVideoNameString] stringByAppendingString:@".jpg"]];
                put.objectKey = imageName;
                put.contentType = @"image/jpeg";
                //拼接URL
                NSString *urlStr = [NSString stringWithFormat:@"%@%@",rootUrl,imageName];
                //添加到数组回传
                [callBackNames addObject:urlStr];
                
                //上传date
                //NSData *data = UIImageJPEGRepresentation(image, 0.3);
                NSData *data = [self imageData:image];
                put.uploadingData = data;
                // 阻塞直到上传完成
                OSSTask * putTask = [client putObject:put];
                [putTask waitUntilFinished];
                
                if (!putTask.error) {
                    NSLog(@"upload object success!");
                    NSLog(@"打印图片地址:%@",urlStr);
                } else {
                    [callBackNames removeAllObjects];
                    if (complete) {
                        dispatch_async(dispatch_get_main_queue(), ^{
                            //返回主线程
                            complete([NSArray arrayWithArray:callBackNames], UploadImageFailed);
                        });
                    }
                }
                if (isAsync) {
                    if (image == images.lastObject) {
                        NSLog(@"upload object finished!");
                        if (complete) {
                            dispatch_async(dispatch_get_main_queue(), ^{
                                //返回主线程
                                complete([NSArray arrayWithArray:callBackNames], UploadImageSuccess);
                            });
                        }
                    }
                }
            }];
            if (queue.operations.count != 0) {
                [operation addDependency:queue.operations.lastObject];
            }
            [queue addOperation:operation];
        }
        i++;
    }
    if (!isAsync) {
        [queue waitUntilAllOperationsAreFinished];
        NSLog(@"haha");
        if (complete) {
            if (complete) {
                //返回主线程
                dispatch_async(dispatch_get_main_queue(), ^{
                    //返回主线程
                    complete([NSArray arrayWithArray:callBackNames], UploadImageSuccess);
                });
                
            }
        }
    }
}

+(NSData *)imageData:(UIImage *)myimage
{
    NSData *data=UIImageJPEGRepresentation(myimage, 1.0);
    if (data.length>100*1024) {
        if (data.length>1024*1024) {//1M以及以上
            //            data = [self compressImage:myimage toMaxFileSize:512*1024/5];
            data=[self resetSizeOfImageData:myimage maxSize:512*1024/5];
            //            data=UIImageJPEGRepresentation(myimage, 0.1);
        }else if (data.length>512*1024) {//0.5M-1M
            data=UIImageJPEGRepresentation(myimage, 0.5);
        }else if (data.length>200*1024) {//0.25M-0.5M
            data=UIImageJPEGRepresentation(myimage, 0.9);
        }
    }
    
    return data;
}
//压缩图片处理(先调整分辨率)
+(NSData*)resetSizeOfImageData:(UIImage*)sourceImage maxSize:(NSInteger)maxSize
{
    //优先调整分辨率
    
    CGSize newSize=CGSizeMake(sourceImage.size.width, sourceImage.size.height);
    
    CGFloat tempHeight=newSize.height/1024;
    
    CGFloat tempWidth=newSize.width/1024;
    
    //    if (tempWidth>1.0&&tempWidth>tempHeight) {
    
    newSize=CGSizeMake(sourceImage.size.width/tempWidth, sourceImage.size.height/tempHeight);
    
    //    }
    
    UIGraphicsBeginImageContext(newSize);
    
    [sourceImage drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    
    UIImage *newImage=UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    //再调整大小
    
    NSData *imageData=UIImageJPEGRepresentation(newImage, 0.4);
    
    NSUInteger sizeOrigin=[imageData length];
    
    NSUInteger sizeOriginKB=sizeOrigin/1024;
    
    if (sizeOriginKB>maxSize) {
        
        NSData *finalImageData=UIImageJPEGRepresentation(newImage, 0.5);
        
        return finalImageData;
    }
    //NSLog(@"#####***%lu",(unsigned long)imageData.length);
    return imageData;
}
+ (void)asyncUploadVideo:(NSData *)data tempVideoFolder:(NSString *)TempVideoFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete{
    [self uploadVideo:data tempVideoFolder:TempVideoFolder isAsync:YES progress:progressBlock complete:complete];
}
+ (void)syncUploadVideo:(NSData *)data tempVideoFolder:(NSString *)TempVideoFolder progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete{
    [self uploadVideo:data tempVideoFolder:TempVideoFolder isAsync:NO progress:progressBlock complete:complete];
}
/// 上传视频
+ (void)uploadVideo:(NSData *)data tempVideoFolder:(NSString *)TempVideoFolder isAsync:(BOOL)isAsync progress:(HBUploadImageManageProgressBlock)progressBlock complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete{
    
        // 2
    id<OSSCredentialProvider> credential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:AccessKey                                                                                                            secretKey:SecretKey];
        //id<OSSCredentialProvider> credential = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:AccessKey secretKeyId:SecretKey securityToken:OSSAuth.securityToken];
        
        OSSClient *client = [[OSSClient alloc] initWithEndpoint:AliYunHost credentialProvider:credential];
        
        //任务执行
        OSSPutObjectRequest * put = [OSSPutObjectRequest new];
        put.bucketName = BucketName;
        put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
        // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度
        //NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
            if (progressBlock) {
                progressBlock(bytesSent,totalByteSent,totalBytesExpectedToSend);
            }
    };
    
        NSString *imageName = [NSString stringWithFormat:@"%@.mp4", TempVideoFolder];
        put.objectKey = imageName;
        
        // 3
        // 传出url
       NSMutableArray *callBackNames = [NSMutableArray array];
        NSString *imageUrl = [NSString stringWithFormat:@"%@/%@", rootUrl,imageName];
        NSLog(@"打印视频URL:%@",imageUrl);
        //添加到数组回传
        [callBackNames addObject:imageUrl];
        put.uploadingData = data;
        
    
        OSSTask * putTask = [client putObject:put];
        [putTask continueWithBlock:^id(OSSTask *task) {
        task = [client presignPublicURLWithBucketName:BucketName
                                        withObjectKey:imageName];
        
            //返回主线程
            dispatch_async(dispatch_get_main_queue(), ^{
                //返回主线程
                if (!task.error) {
                    NSLog(@"upload object success!");
                    if (complete) {
                        complete([NSArray arrayWithArray:callBackNames], UploadImageSuccess);
                    }
                } else {
                    NSLog(@"upload object failed, error: %@" , putTask.error);
                    if (complete) {
                        complete([NSArray arrayWithArray:callBackNames], UploadImageFailed);
                    }
                }
            });
        return nil;
    }];
   
    
}
@end

END.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明似水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值