iOS阿里云对象存储 OSS文件的上传/下载的实现

之前的项目中,图片语音等资源文件都是直接上传数据流给服务器,然后服务器进行处理和存储。最近的这个项目,服务器直接开的OSS,然后客户端直接使用阿里云提供的上传下载功能来上传和下载资源。
阿里云对图片的处理做的很到位,尺寸在获取图片时可自定义。
首先在项目中导入阿里云OSS的库,直接在pod中加上如下代码:

pod 'AliyunOSSiOS'

如果不是用pod的话,可点击此链接前往下载:https://help.aliyun.com/document_detail/32173.html
我们可以封装一个OSS的工具类,专门用来管理文件的上传和下载。OSS的初始化和配置代码:

//以下参数服务器端可提供
#define ACCKEY @"Mt5jQPnQQECHqTEST"
#define ACCSECRET @"2QgUjalQoBsdLn2iYFpqW0TEST"
#define ENDPOINT @"http://oss-cn-hangzhou.aliyuncs.com"

#import "BZHttpFileHelper.h"
#import <AliyunOSSiOS/OSSService.h>

@interface BZHttpFileHelper ()

@property(nonatomic,strong) OSSClient * client;

@end

@implementation BZHttpFileHelper
+(instancetype)fileHelperShareInstance{
    static BZHttpFileHelper * fileHelper = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        fileHelper = [[BZHttpFileHelper alloc] init];
        [fileHelper initAliClient];
    });
    return fileHelper;
}

-(void)initAliClient{
    id<OSSCredentialProvider> credential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:ACCKEY                                                                                                    secretKey:ACCSECRET];

    OSSClientConfiguration * conf = [OSSClientConfiguration new];

    // 网络请求遇到异常失败后的重试次数
    conf.maxRetryCount = 3;

    // 网络请求的超时时间
    conf.timeoutIntervalForRequest =30;

    // 允许资源传输的最长时间
    conf.timeoutIntervalForResource =24 * 60 * 60;

    // 你的阿里地址前面通常是这种格式 :http://oss……
    self.client = [[OSSClient alloc] initWithEndpoint:ENDPOINT credentialProvider:credential];
}

文件上传,将文件转换为NSData即可直接上传:

-(void)uploadAmr:(NSData *)amrData amrName:(NSString *)amrName callback:(void (^)(BOOL))callback{
    OSSPutObjectRequest * put = [OSSPutObjectRequest new];
    put.bucketName = @"test";
    put.objectKey = amrName;
    put.uploadingData = amrData; // 直接上传NSData
    put.uploadProgress = ^(int64_t bytesSent,int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
        NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);
    };

    OSSTask * putTask = [self.client putObject:put];

    // 上传阿里云
    [putTask continueWithBlock:^id(OSSTask *task) {
        if (!task.error) {
            NSLog(@"upload object success!");
            if (callback) {
                callback(YES);
            }
        } else {

            NSLog(@"upload object failed, error: %@" , task.error);
            if (callback) {
                callback(NO);
            }
            dispatch_async(dispatch_get_main_queue(), ^{
                UIWindow * window = [[[UIApplication sharedApplication] delegate] window];
                [window makeToast:@"文件上传失败" duration:1.5 position:CSToastPositionCenter];
            });
        }
        return nil;
    }];
}

文件下载:

-(void)downloadFile:(NSString *)filename callback:(void (^)(NSData *, BOOL))callback{
    OSSGetObjectRequest * request = [OSSGetObjectRequest new];
    request.bucketName = @"savemoney";
    request.objectKey = filename;
    OSSTask * getTask = [self.client getObject:request];
    [getTask continueWithBlock:^id(OSSTask *task) {
        if (!task.error) {
            NSLog(@"download object success!");
            OSSGetObjectResult * getResult = task.result;
            if (callback) {
                callback(getResult.downloadedData,YES);
            }
        } else {
            NSLog(@"download object failed, error: %@" ,task.error);
            if (callback) {
                callback(nil,NO);
            }
        }
        return nil;
    }];
}

上传时文件名是我们定义的,下载的时候只要拿这个文件名即可下载。
所以用了OSS之后,上传图片等文件的步骤是我们客户端先将文件上传到OSS,然后将文件名通过接口给服务器,服务器存储文件名,在需要文件的地方服务器给我们文件名,我们再去OSS上取。
也可参考阿里云OSS的开发文档:https://help.aliyun.com/document_detail/32055.html?spm=a2c4g.11186623.6.726.oKF88C
最后说一下图片的加载,我们可以按照自己需要的格式来读取图片,可以写一个NSURL的分类,来返回不同的图片的路径。
因为服务器存的是文件名,读取原图片cdn域名+文件名,可用下面的代码来获取图片完整路径:

+(NSURL *)photourlWithUrlString:(NSString *)url{
    //原图
    return [NSURL URLWithString:[NSString stringWithFormat:@"http://savemcdn.dewtip.com/%@",url]];
}

+(NSURL *)s_photourlWithUrlString:(NSString *)url{
//120*120的图片
    return [NSURL URLWithString:[NSString stringWithFormat:@"http://savemcdn.dewtip.com/%@?x-oss-process=image/resize,w_120,h_120",url]];
}

+(NSURL *)s_chatPhotourlWithUrlString:(NSString *)url{
//
    return [NSURL URLWithString:[NSString stringWithFormat:@"http://savemcdn.dewtip.com/%@?x-oss-process=image/resize,m_lfit,h_200,w_200",url]];
}

更多图片样式及处理可参考官方文档:https://www.alibabacloud.com/help/zh/doc-detail/48884.htm?spm=a2c63.p38356.b99.427.75926010lb0FXv
OSS对图片处理的支持确实很到位,用起来很方便。

猜你喜欢

转载自blog.csdn.net/aaaaazq/article/details/80759292