Files
featherVoice/QXLive/Tools/COS/QXCOSUploadManager.m

227 lines
10 KiB
Mathematica
Raw Normal View History

2025-10-24 10:52:40 +08:00
//
// QXCOSUploadManager.m
// QXLive
//
// Created by on 2025/10/23.
//
#import "QXCOSUploadManager.h"
#import <QCloudCOSXML/QCloudCOSXMLTransfer.h>
@implementation QXCOSUploadManager
+(instancetype)shareManager{
static QXCOSUploadManager *manager = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
manager = [[QXCOSUploadManager alloc] init];
});
return manager;
}
- (instancetype)init
{
self = [super init];
if (self) {
// 4
[QCloudHTTPSessionManager shareClient].customConcurrentCount = 4;
// 8
[QCloudHTTPSessionManager shareClient].maxConcurrencyTask = 9;
}
return self;
}
-(void)uploadFile:(NSArray *)files withObjectKey:(NSArray *)objectKeys isAsync:(BOOL)isAsync complete:(void (^)(NSArray<NSString *> * _Nullable, QXCOSUploadImageState))complete{
[[QXRequset shareInstance] getWithUrl:[NSString stringWithFormat:@"%@%@",ServerUrl,QXGetCosTempKeys] parameters:@{} needCache:NO success:^(id responseObject) {
QXCOSUploadModel *model = [QXCOSUploadModel yy_modelWithJSON:responseObject[@"data"]];
if (![model.region isExist] || ![model.bucket isExist] || ![model.credentials.sessionToken isExist] || ![model.credentials.tmpSecretId isExist] || ![model.credentials.tmpSecretKey isExist]) {
QXLOG(@"服务端配置错误");
complete(@[],QXCOSUploadImageFailed);
return;
}
NSString *region = model.region;
QCloudServiceConfiguration* configuration = [QCloudServiceConfiguration new];
QCloudCOSXMLEndPoint* endpoint = [[QCloudCOSXMLEndPoint alloc] init];
endpoint.regionName = region;
// 使 HTTPS
endpoint.useHTTPS = true;
configuration.endpoint = endpoint;
// COS
[QCloudCOSXMLService registerDefaultCOSXMLWithConfiguration:configuration];
[QCloudCOSTransferMangerService registerDefaultCOSTransferMangerWithConfiguration:configuration];
NSString *bucket = model.bucket;
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = files.count;
NSMutableArray *callBackNames = [NSMutableArray array];
for (int i = 0 ; i < files.count ;i++) {
id file = files[i];
if (file) {
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
QCloudCOSXMLUploadObjectRequest* put = [QCloudCOSXMLUploadObjectRequest new];
QCloudCredential * credential = [QCloudCredential new];
credential.secretID = model.credentials.tmpSecretId;
credential.secretKey = model.credentials.tmpSecretKey;
credential.token = model.credentials.sessionToken;
//
put.credential = credential;
put.bucket = bucket;
put.object = [NSString stringWithFormat:@"%@%@",IMG_FILE_BASE_PATH,objectKeys[i]];
if ([file isKindOfClass:[UIImage class]]) {
NSData *data = UIImageJPEGRepresentation(file, 0.3);
put.body = data;
}else if ([file isKindOfClass:[NSData class]]){
put.body = file;
}else if ([file isKindOfClass:[NSURL class]]){
put.body = (NSURL *)file;
}
//
[put setSendProcessBlock:^(int64_t bytesSent,
int64_t totalBytesSent,
int64_t totalBytesExpectedToSend) {
// bytesSent
// totalBytesSent
// totalBytesExpectedToSend
}];
//
[put setFinishBlock:^(QCloudUploadObjectResult *result, NSError *error) {
if (!error) {
NSLog(@"upload object success!");
} else {
NSLog(@"upload object failed, error: %@" , error);
}
NSString * fileUrl = result.location;
[callBackNames addObject:fileUrl];
if (isAsync) {
if (file == files.lastObject) {
NSLog(@"upload object finished!");
if (complete) {
complete([NSArray arrayWithArray:callBackNames] ,QXCOSUploadImageSuccess);
}
}
}
}];
[[QCloudCOSTransferMangerService defaultCOSTransferManager] UploadObject:put];
}];
if (queue.operations.count != 0) {
[operation addDependency:queue.operations.lastObject];
}
[queue addOperation:operation];
}
if (!isAsync) {
[queue waitUntilAllOperationsAreFinished];
NSLog(@"haha");
if (complete) {
if (complete) {
complete([NSArray arrayWithArray:callBackNames], QXCOSUploadImageSuccess);
}
}
}
}
} fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) {
}];
}
-(void)activityUploadFile:(NSArray *)files withObjectKey:(NSArray *)objectKeys isAsync:(BOOL)isAsync complete:(void (^)(NSArray<NSString *> * _Nonnull, QXCOSUploadImageState))complete{
[[QXRequset shareInstance] getWithUrl:[NSString stringWithFormat:@"%@%@",ServerUrl,QXGetCosTempKeys] parameters:@{} needCache:NO success:^(id responseObject) {
QXCOSUploadModel *model = [QXCOSUploadModel yy_modelWithJSON:responseObject[@"data"]];
if (![model.region isExist] || ![model.bucket isExist] || ![model.credentials.sessionToken isExist] || ![model.credentials.tmpSecretId isExist] || ![model.credentials.tmpSecretKey isExist]) {
QXLOG(@"服务端配置错误");
complete(@[],QXCOSUploadImageFailed);
return;
}
NSString *region = model.region;
QCloudServiceConfiguration* configuration = [QCloudServiceConfiguration new];
QCloudCOSXMLEndPoint* endpoint = [[QCloudCOSXMLEndPoint alloc] init];
endpoint.regionName = region;
// 使 HTTPS
endpoint.useHTTPS = true;
configuration.endpoint = endpoint;
// COS
[QCloudCOSXMLService registerDefaultCOSXMLWithConfiguration:configuration];
[QCloudCOSTransferMangerService registerDefaultCOSTransferMangerWithConfiguration:configuration];
NSString *bucket = model.bucket;
NSMutableArray *callBackNames = [NSMutableArray array];
for (int i = 0 ; i < files.count ;i++) {
id file = files[i];
if (file) {
QCloudCOSXMLUploadObjectRequest* put = [QCloudCOSXMLUploadObjectRequest new];
QCloudCredential * credential = [QCloudCredential new];
credential.secretID = model.credentials.tmpSecretId;
credential.secretKey = model.credentials.tmpSecretKey;
credential.token = model.credentials.sessionToken;
//
put.credential = credential;
put.bucket = bucket;
put.object = [NSString stringWithFormat:@"%@%@",IMG_FILE_BASE_PATH,objectKeys[i]];
if ([file isKindOfClass:[UIImage class]]) {
NSData *data = UIImageJPEGRepresentation(file, 0.3);
put.body = data;
}else if ([file isKindOfClass:[NSData class]]){
put.body = file;
}else if ([file isKindOfClass:[NSURL class]]){
put.body = (NSURL *)file;
}
//
[put setSendProcessBlock:^(int64_t bytesSent,
int64_t totalBytesSent,
int64_t totalBytesExpectedToSend) {
// bytesSent
// totalBytesSent
// totalBytesExpectedToSend
}];
//
[put setFinishBlock:^(QCloudUploadObjectResult *result, NSError *error) {
if (!error) {
NSLog(@"upload object success!");
} else {
NSLog(@"upload object failed, error: %@" , error);
}
NSString * fileUrl = result.location;
[callBackNames addObject:fileUrl];
if (isAsync) {
if (i == files.count-1) {
NSLog(@"upload object finished!");
if (complete) {
complete([NSArray arrayWithArray:callBackNames] ,QXCOSUploadImageSuccess);
}
}
}
}];
[[QCloudCOSTransferMangerService defaultCOSTransferManager] UploadObject:put];
}
}
} fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) {
}];
}
- (NSString *)currentDate {
NSTimeInterval interval = [[NSDate date] timeIntervalSince1970];
long long timestampInMilliseconds = interval * 1000;
return [NSString stringWithFormat:@"%lld",timestampInMilliseconds];
}
@end
@implementation QXCOSUploadModel
+(NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass{
return @{
@"credentials" : @"QXCOSUploadCredentialsModel",
};
}
@end
@implementation QXCOSUploadCredentialsModel
@end