iOS 阿里云服务器图片上传

1.首先集成阿里云的SDK,建议CocoaPods直接导入,不然太坑了。。。
我是直接引入OSS iOS SDK框架,也就是这个(按文档走,需要自己打包生成,下面介绍)

iOS 阿里云服务器图片上传_第1张图片
5802D16E-8CB4-4EC2-A006-967CA8376ABD.png

2.SDK集成之后,就可以敲代码了

先把核心代码贴出来

//初始化(AccessKey   SecretKey  这个都知道吧)
id credential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:AccessKey                                                                                                            secretKey:SecretKey];

//AliYunHost(http://oss-cn-hangzhou.aliyuncs.com)就是域名访问
OSSClient *client = [[OSSClient alloc] initWithEndpoint:AliYunHost credentialProvider:credential];

//任务执行
OSSPutObjectRequest * put = [OSSPutObjectRequest new];
//阿里云控制台-对象存储OSS下你所要存储的Bucket的名称
put.bucketName = BucketName;

//存储路径以及图片保存的名称
NSString *imageName = [kTempFolder stringByAppendingPathComponent:[[NSUUID UUID].UUIDString stringByAppendingString:@".jpg"]];
put.objectKey = imageName;

//设置上传文件格式(告诉浏览器这是图片,不然默认的是下载)
put.contentType = @"image/jpeg";

 //上传date(上传之后直接就是照片格式)
NSData *data = UIImageJPEGRepresentation(image, 0.3);
put.uploadingData = data;

// 阻塞直到上传完成
OSSTask * putTask = [client putObject:put];
[putTask waitUntilFinished]; 

//上传成功或者失败
if (!putTask.error) {
       NSLog(@"upload object success!");
    } else {
     NSLog(@"upload object failed, error: %@" , putTask.error);
    }

3.接下来把我的上传图片的类贴出来
.h文件

#import 
#import 

typedef NS_ENUM(NSInteger, UploadImageState) {
    UploadImageFailed   = 0,
    UploadImageSuccess  = 1
};

@interface OSSImageUploader : NSObject

+ (void)asyncUploadImage:(UIImage *)image complete:(void(^)(NSArray *names,UploadImageState state))complete;

+ (void)syncUploadImage:(UIImage *)image complete:(void(^)(NSArray *names,UploadImageState state))complete;

+ (void)asyncUploadImages:(NSArray *)images complete:(void(^)(NSArray *names, UploadImageState state))complete;

+ (void)syncUploadImages:(NSArray *)images complete:(void(^)(NSArray *names, UploadImageState state))complete;

@end

.m文件

#import "OSSImageUploader.h"
#import 

@implementation OSSImageUploader
需要的一些基本信息
static NSString *const AccessKey = @"";
static NSString *const SecretKey = @"";
static NSString *const BucketName = @"";
static NSString *const AliYunHost = @"";
static NSString *kTempFolder = @"";

+ (void)asyncUploadImage:(UIImage *)image complete:(void(^)(NSArray *names,UploadImageState state))complete
{
    [self uploadImages:@[image] isAsync:YES complete:complete];
}

+ (void)syncUploadImage:(UIImage *)image complete:(void(^)(NSArray *names,UploadImageState state))complete
{
    [self uploadImages:@[image] isAsync:NO complete:complete];
}

+ (void)asyncUploadImages:(NSArray *)images complete:(void(^)(NSArray *names, UploadImageState state))complete
{
    [self uploadImages:images isAsync:YES complete:complete];
}

+ (void)syncUploadImages:(NSArray *)images complete:(void(^)(NSArray *names, UploadImageState state))complete
{
    [self uploadImages:images isAsync:NO complete:complete];
}

+ (void)uploadImages:(NSArray *)images isAsync:(BOOL)isAsync complete:(void(^)(NSArray *names, UploadImageState state))complete
{
    id 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;

                //文件路径及名称拼接
                NSString *imageName = [kTempFolder stringByAppendingPathComponent:[[NSUUID UUID].UUIDString stringByAppendingString:@".jpg"]];               
                put.objectKey = imageName;
                put.contentType = @"image/jpeg";
                //添加到数组回传
                [callBackNames addObject:imageName];

                //上传date
                NSData *data = UIImageJPEGRepresentation(image, 0.3);
                put.uploadingData = data;
                // 阻塞直到上传完成
                OSSTask * putTask = [client putObject:put];
                [putTask waitUntilFinished]; 
                if (!putTask.error) {
                    NSLog(@"upload object success!");
                } else {
                    NSLog(@"upload object failed, error: %@" , putTask.error);
                }
                if (isAsync) {
                    if (image == images.lastObject) {
                        NSLog(@"upload object finished!");
                        if (complete) {
                            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) {
                complete([NSArray arrayWithArray:callBackNames], UploadImageSuccess);
            }
        }
    }
}

4.下面说一下,在我克隆下来SDK,打包AliyunOSSiOS.framework文件遇到的问题


iOS 阿里云服务器图片上传_第2张图片
C0F2DCA7-3328-431A-99B5-15934595E7DB.png

不仅有中文,路径也有问题,最好去这里拷贝一下


iOS 阿里云服务器图片上传_第3张图片
AC086788-BB42-41C7-AC31-CF76661796A8.png

然后运行包装脚本

sh ./buildFramework.sh

输入将生成AliyunOSSiOS.framework的生成包装目录

cd Products && ls

然后去你自己指定的目录下,把生成的AliyunOSSiOS.framework的生成包,拽进工程。

希望可以帮助到你!!加油!!

参考文章

你可能感兴趣的:(iOS 阿里云服务器图片上传)