向阿里云OSS里边上传图片,iOS系统,Objective-C语言。
//
// AliOssUploadFiles.h
// AliyunOssDemo
//
// Created by Admin on 2018/10/17.
// Copyright © 2018 huaibor. All rights reserved.
//
#import <Foundation/Foundation.h>
//
#import "AliOssUploadModel.h"
#define AliOSSFileManager [AliOssUploadFiles manager]
@interface AliOssUploadFiles : NSObject
+ (instancetype)manager;
//上传
- (void)uploadImages:(NSArray *)images beginHandle:(void(^)(void))beginHandle complate:(void(^)(NSArray *callResult,NSError *error))complate;
//处理图片,返回json字符串
- (NSString *)dealImageByUploadWithModels:(NSArray *)models;
@end
//
// AliOssUploadFiles.m
// AliyunOssDemo
//
// Created by Admin on 2018/10/17.
// Copyright © 2018 huaibor. All rights reserved.
//
#import "AliOssUploadFiles.h"
#import <AliyunOSSiOS/AliyunOSSiOS.h>
#define OSSEndpoint @""
#define OSSAccessKey @""
#define OSSSecretKey @""
#define OSSBucketName @""
#define OSSUploadDic @""
#define OSSImageSuffix @""
#define OSSUploadFileSuffix @".jpg"
//
#define FileUploadFailureReasonErrorValue @"文件上传错误"
#define FileUploadFailureReasonErrorCode -10090
@interface AliOssUploadFiles()
@property (nonatomic, strong) dispatch_semaphore_t dsema;
//
@property (nonatomic,strong)id<OSSCredentialProvider> credential;
@property (nonatomic,strong)OSSClientConfiguration *config;
@property (nonatomic,strong)OSSClient *client;
@end
@implementation AliOssUploadFiles
+ (instancetype)manager
{
static dispatch_once_t onceQueue;
static AliOssUploadFiles *ossUploadFiles = nil;
dispatch_once(&onceQueue, ^{
ossUploadFiles = [[self alloc] init];
});
return ossUploadFiles;
}
- (instancetype)init
{
self = [super init];
if(self){
_dsema = dispatch_semaphore_create(1);
//
[self configUploadParams];
}
return self;
}
//配置oss
- (void)configUploadParams
{
_credential = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:OSSAccessKey secretKey:OSSSecretKey];
//
_config = [OSSClientConfiguration new];
_config.maxRetryCount = 6;
_config.timeoutIntervalForRequest = 30;
_config.timeoutIntervalForResource = 24 * 60 * 60;
//
_client = [[OSSClient alloc] initWithEndpoint:OSSEndpoint credentialProvider:_credential clientConfiguration:_config];
}
//上传
//异步序列同传,
- (void)uploadImages:(NSArray *)images beginHandle:(void(^)(void))beginHandle complate:(void(^)(NSArray *callResult,NSError *error))complate
{
NSLog(@"begin upload !");
if(beginHandle != nil) beginHandle();
NSInteger uploadCount = images.count;
NSMutableArray *callBackResults = [NSMutableArray array];
//
for (NSInteger i = 0; i < uploadCount; i++) {
dispatch_semaphore_wait(_dsema, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ //
UIImage *uploadImage = images[i];
//请求3
OSSPutObjectRequest * put = [OSSPutObjectRequest new];
put.bucketName = OSSBucketName;
put.objectKey = [NSString stringWithFormat:@"%@%@%@",OSSUploadDic,self.srandString,OSSUploadFileSuffix];
//如果大于5M则压缩
put.uploadingData = [uploadImage compressToByte:ImageDataMaxByte];
//UIImagePNGRepresentation(uploadImage);
//
AliOssUploadModel *uploadModel = [AliOssUploadModel new];
uploadModel.width = CGImageGetWidth(uploadImage.CGImage);
uploadModel.height = CGImageGetHeight(uploadImage.CGImage);
uploadModel.sourcePath = [NSString stringWithFormat:@"%@/%@",OSSEndpoint,put.objectKey];
uploadModel.smallPath = [NSString stringWithFormat:@"%@/%@%@",OSSEndpoint,put.objectKey,OSSImageSuffix];
// put.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {
// // 当前上传段长度、当前已经上传总长度、一共需要上传的总长度
// };
OSSTask * putTask = [_client putObject:put];
[putTask continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
OSSHeadObjectResult *headResult = task.result;
if(headResult.httpResponseCode == RequestSucceedCode){
[callBackResults addObject:uploadModel];
//界面刷新
if(callBackResults.count == uploadCount){
dispatch_async(dispatch_get_main_queue(), ^{
complate(callBackResults.copy,nil);
});
}
}
} else {
NSLog(@"upload object failed, error: %@" , task.error);
dispatch_async(dispatch_get_main_queue(), ^{
complate(nil,[self uploadError]);
});
}
return nil;
}];
//[putTask waitUntilFinished];
dispatch_semaphore_signal(_dsema);
});
}
}
//处理图片,返回json字符串
- (NSString *)dealImageByUploadWithModels:(NSArray *)models;
{
NSMutableArray *uploadImages = [NSMutableArray array];
[models enumerateObjectsUsingBlock:^(AliOssUploadModel *uploadObj, NSUInteger idx, BOOL * _Nonnull stop) {
[uploadImages addObject:uploadObj.uploadDictionaryByModel];
}];
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:uploadImages options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
if(error == nil){
return jsonString;
}else{
return nil;
}
}
//随机字符串-唯一
- (NSString *)srandString
{
/*
static int kNumber = 15;
NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString *resultStr = [[NSMutableString alloc] init];
srand((unsigned)time(0));
for (int i = 0; i < kNumber; i++)
{
unsigned index = rand() % [sourceStr length];
NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
[resultStr appendString:oneStr];
}
*/
NSMutableString *resultStr = [[NSMutableString alloc] init];
NSTimeInterval nowtime = [[NSDate date] timeIntervalSince1970] * 1000;
long long theTime = [[NSNumber numberWithDouble:nowtime] longLongValue];
NSString *curTime = [NSString stringWithFormat:@"%llu",theTime];
//
CFUUIDRef uuidRef =CFUUIDCreate(NULL);
CFStringRef uuidStringRef =CFUUIDCreateString(NULL, uuidRef);
CFRelease(uuidRef);
NSString *uniqueId = (__bridge NSString *)uuidStringRef;
[resultStr appendString:curTime];
[resultStr appendString:uniqueId];
return resultStr.copy;
}
//没网网络返回Error
- (NSError *)uploadError
{
NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:FileUploadFailureReasonErrorValue, NSLocalizedFailureReasonErrorKey,nil];
NSError *error = [[NSError alloc] initWithDomain:NSCocoaErrorDomain code:FileUploadFailureReasonErrorCode userInfo:userInfo];
return error;
}
/*
* config
*/
/*
UserAgent 用户代理,指HTTP的User-Agent头。默认为”aliyun-sdk-java”
ProxyHost 代理服务器主机地址
ProxyPort 代理服务器端口
ProxyUsername 代理服务器验证的用户名
ProxyPassword 代理服务器验证的密码
ProxyDomain 访问NTLM验证的代理服务器的Windows域名
ProxyWorkstation NTLM代理服务器的Windows工作站名称
MaxConnections 允许打开的最大HTTP连接数。默认为50
SocketTimeout 通过打开的连接传输数据的超时时间(单位:毫秒)。默认为50000毫秒
ConnectionTimeout 建立连接的超时时间(单位:毫秒)。默认为50000毫秒
MaxErrorRetry 可重试的请求失败后最大的重试次数。默认为3次
*/
@end
// // AliOssUploadModel.h // AliyunOssDemo // // Created by Admin on 2018/10/17. // Copyright © 2018 huaibor. All rights reserved. // #import "PublicModel.h" #import <UIKit/UIKit.h> @interface AliOssUploadModel : PublicModel @property (nonatomic,strong)NSString *sourcePath; @property (nonatomic,strong)NSString *smallPath; @property (nonatomic,assign)CGFloat width; @property (nonatomic,assign)CGFloat height; //model转换成字典 - (id)uploadDictionaryByModel; @end
//
// AliOssUploadModel.m
// AliyunOssDemo
//
// Created by Admin on 2018/10/17.
// Copyright © 2018 huaibor. All rights reserved.
//
#import "AliOssUploadModel.h"
@implementation AliOssUploadModel
- (id)uploadDictionaryByModel
{
NSMutableDictionary *params = [NSMutableDictionary dictionary];
unsigned int count;
objc_property_t *properties = class_copyPropertyList([self class], &count);
for(int i = 0; i < count; i++)
{
objc_property_t property = properties[i];
NSString *nameString = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
if([self valueForKey:nameString] == nil){
[params setValue:[self valueForKey:nameString] forKey:@""];
}else{
[params setValue:[self valueForKey:nameString] forKey:nameString];
}
//
}
free(properties);
return params.copy;
}
@end

