美文网首页
iOS 阿里云服务器图片上传

iOS 阿里云服务器图片上传

作者: 安静就好_ | 来源:发表于2018-01-12 20:51 被阅读2414次

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

    5802D16E-8CB4-4EC2-A006-967CA8376ABD.png

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

    先把核心代码贴出来
    
    //初始化(AccessKey   SecretKey  这个都知道吧)
    id<OSSCredentialProvider> 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 <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    
    typedef NS_ENUM(NSInteger, UploadImageState) {
        UploadImageFailed   = 0,
        UploadImageSuccess  = 1
    };
    
    @interface OSSImageUploader : NSObject
    
    + (void)asyncUploadImage:(UIImage *)image complete:(void(^)(NSArray<NSString *> *names,UploadImageState state))complete;
    
    + (void)syncUploadImage:(UIImage *)image complete:(void(^)(NSArray<NSString *> *names,UploadImageState state))complete;
    
    + (void)asyncUploadImages:(NSArray<UIImage *> *)images complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete;
    
    + (void)syncUploadImages:(NSArray<UIImage *> *)images complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete;
    
    @end
    

    .m文件

    #import "OSSImageUploader.h"
    #import <AliyunOSSiOS/OSSService.h>
    
    @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<NSString *> *names,UploadImageState state))complete
    {
        [self uploadImages:@[image] isAsync:YES complete:complete];
    }
    
    + (void)syncUploadImage:(UIImage *)image complete:(void(^)(NSArray<NSString *> *names,UploadImageState state))complete
    {
        [self uploadImages:@[image] isAsync:NO complete:complete];
    }
    
    + (void)asyncUploadImages:(NSArray<UIImage *> *)images complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete
    {
        [self uploadImages:images isAsync:YES complete:complete];
    }
    
    + (void)syncUploadImages:(NSArray<UIImage *> *)images complete:(void(^)(NSArray<NSString *> *names, UploadImageState state))complete
    {
        [self uploadImages:images isAsync:NO complete:complete];
    }
    
    + (void)uploadImages:(NSArray<UIImage *> *)images isAsync:(BOOL)isAsync 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;
    
                    //文件路径及名称拼接
                    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文件遇到的问题


    C0F2DCA7-3328-431A-99B5-15934595E7DB.png

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


    AC086788-BB42-41C7-AC31-CF76661796A8.png

    然后运行包装脚本

    sh ./buildFramework.sh
    

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

    cd Products && ls
    

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

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

    参考文章

    相关文章

      网友评论

          本文标题:iOS 阿里云服务器图片上传

          本文链接:https://www.haomeiwen.com/subject/jrxqoxtx.html