之前的项目中,图片语音等资源文件都是直接上传数据流给服务器,然后服务器进行处理和存储。最近的这个项目,服务器直接开的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];
// 上传[阿里云](https://l.gushuji.site/aliyun)
[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对图片处理的支持确实很到位,用起来很方便。