ali OSS 上传

+ (instancetype)manager {

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_instance = [[self alloc] init];

});

return _instance;

}

- (instancetype)init {

if (self = [super init]) {

[self getDownloadItems];

[self initOSSClient];

if(!self.allUplaodReceipts) self.allUplaodReceipts = [NSMutableDictionary dictionary];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(saveUploadItems) name:kYCUploadSessionSaveUploadStatus object:nil];

}

return self;

}

简单上传

- (OSSPutObject *)uploadReceiptForModel:(DiskCloudDiskModel *)model withCell:(MyDiskFileCell *)cell IndexPath:(NSIndexPath *)indexPath{

if (model.urlOutputPath == nil) return nil;

DiskCloudDiskModel * oldModel = self.allUplaodReceipts[[NSString stringWithFormat:@"%@",model.Oid]];

OSSPutObject *receipt = oldModel.putObject;

if (receipt && oldModel.isShowPress) return receipt;

receipt = [OSSPutObject new];

model.putObject = receipt;

receipt.bucketName = bucketNames;

receipt.objectKey = [NSString stringWithFormat:@"%@%@",[HSInstance shareInstance].userInfo.SessionID,[NSString timeStampAtNow]];

NSLog(@"%@",receipt.objectKey);

receipt.uploadingFileURL = model.urlOutputPath;

receipt.contentType = @"";

receipt.contentMd5 = @"";

receipt.contentEncoding = @"";

receipt.contentDisposition = @"";

AaronUploadItem * item = [AaronUploadItem new];

receipt.uploadProgress = ^(int64_t bytesSent, int64_t totalByteSent, int64_t totalBytesExpectedToSend) {

NSLog(@"%lld, %lld, %lld", bytesSent, totalByteSent, totalBytesExpectedToSend);

CGFloat progress = (CGFloat)totalByteSent/totalBytesExpectedToSend;

dispatch_async(dispatch_get_main_queue(), ^{

model.passValue = progress;

cell.progress = progress;

});

};

OSSTask *putTask = [clients putObject:receipt];

[putTask continueWithBlock:^id(OSSTask *task) {

if (!task.error) {

model.isShowPress = NO;

model.isUpload = NO;

[item uploadReceiptForcomplete];

if ([self.delegate respondsToSelector:@selector(uploadItemStatusChanged:)]) {

[self.delegate uploadItemStatusChanged:model];

}

NSLog(@"upload object success!");

} else {

NSLog(@"upload object failed, error: %@" , task.error);

}

return nil;

}];

[self.allUplaodReceipts setObject:model forKey:[NSString stringWithFormat:@"%@",model.Oid]];

[self saveUploadItems];

return receipt;

}

// 断点续传

- (void)resumableUploadModel:(DiskCloudDiskModel *)model withCell:(MyDiskFileCell *)cell IndexPath:(NSIndexPath *)indexPath {

__block NSString * recordKey;

//    NSString * docDir = [self getDocumentDirectory];

//    NSString * filePath = [docDir stringByAppendingPathComponent:@"file10m"];

NSString * bucketName = bucketNames;

NSString * objectKey = [NSString stringWithFormat:@"%@%@",[HSInstance shareInstance].userInfo.SessionID,[NSString timeStampAtNow]];

[[[[[[OSSTask taskWithResult:nil] continueWithBlock:^id(OSSTask *task) {

// 为该文件构造一个唯一的记录键

NSURL * fileURL = model.urlOutputPath;

NSDate * lastModified;

NSError * error;

[fileURL getResourceValue:&lastModified forKey:NSURLContentModificationDateKey error:&error];

if (error) {

return [OSSTask taskWithError:error];

}

recordKey = [NSString stringWithFormat:@"%@-%@-%@-%@", bucketName, objectKey, [OSSUtil getRelativePath:model.urlOutputPath.absoluteString], lastModified];

// 通过记录键查看本地是否保存有未完成的UploadId

NSUserDefaults * userDefault = [NSUserDefaults standardUserDefaults];

return [OSSTask taskWithResult:[userDefault objectForKey:recordKey]];

}] continueWithSuccessBlock:^id(OSSTask *task) {

if (!task.result) {

// 如果本地尚无记录,调用初始化UploadId接口获取

OSSInitMultipartUploadRequest * initMultipart = [OSSInitMultipartUploadRequest new];

initMultipart.bucketName = bucketName;

initMultipart.objectKey = objectKey;

initMultipart.contentType = @"application/octet-stream";

return [clients multipartUploadInit:initMultipart];

}

OSSLogVerbose(@"An resumable task for uploadid: %@", task.result);

return task;

}] continueWithSuccessBlock:^id(OSSTask *task) {

NSString * uploadId = nil;

if (task.error) {

return task;

}

if ([task.result isKindOfClass:[OSSInitMultipartUploadResult class]]) {

uploadId = ((OSSInitMultipartUploadResult *)task.result).uploadId;

} else {

uploadId = task.result;

}

if (!uploadId) {

return [OSSTask taskWithError:[NSError errorWithDomain:OSSClientErrorDomain

code:OSSClientErrorCodeNilUploadid

userInfo:@{OSSErrorMessageTOKEN: @"Can't get an upload id"}]];

}

// 将“记录键:UploadId”持久化到本地存储

NSUserDefaults * userDefault = [NSUserDefaults standardUserDefaults];

[userDefault setObject:uploadId forKey:recordKey];

[userDefault synchronize];

return [OSSTask taskWithResult:uploadId];

}] continueWithSuccessBlock:^id(OSSTask *task) {

// 持有UploadId上传文件

OSSResumableUploadRequest * resumableUpload = [OSSResumableUploadRequest new];

resumableUpload.bucketName = bucketName;

resumableUpload.objectKey = objectKey;

resumableUpload.uploadId = task.result;

model.resumableUpload = resumableUpload;

resumableUpload.uploadingFileURL = model.urlOutputPath;

resumableUpload.uploadProgress = ^(int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) {

NSLog(@"%lld %lld %lld", bytesSent, totalBytesSent, totalBytesExpectedToSend);

CGFloat progress = (CGFloat)totalBytesSent/totalBytesExpectedToSend;

dispatch_async(dispatch_get_main_queue(), ^{

model.passValue = progress;

cell.progress = progress;

});

};

return [clients resumableUpload:resumableUpload];

}] continueWithBlock:^id(OSSTask *task) {

if (task.error) {

if ([task.error.domain isEqualToString:OSSClientErrorDomain] && task.error.code == OSSClientErrorCodeCannotResumeUpload) {

// 如果续传失败且无法恢复,需要删除本地记录的UploadId,然后重启任务

[[NSUserDefaults standardUserDefaults] removeObjectForKey:recordKey];

}

} else {

NSLog(@"upload completed!");

// 上传成功,删除本地保存的UploadId

[[NSUserDefaults standardUserDefaults] removeObjectForKey:recordKey];

}

return nil;

}];

}


#pragma mark- OSS Method/* STS */

- (void)initOSSClient { 

 idcredential2 = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * {

OSSTaskCompletionSource * tcs = [OSSTaskCompletionSource taskCompletionSource];

NSString * urlString = [BASE_URL(loginToken) stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

[dict setValue:@"c432626a-1754-4874-8c1d-2fa4356188a8" forKey:@"SessionID"];

//   设置 指示器 无蒙板效果

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

manager.requestSerializer = [AFJSONRequestSerializer serializer];

manager.responseSerializer = [AFJSONResponseSerializer serializer];

[manager.requestSerializer setValue:@"c432626a-1754-4874-8c1d-2fa4356188a8" forHTTPHeaderField:@"SessionID"];

[manager POST:urlString parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

NSLog(@"OSSTaskCompletionSource responseObject = %@",responseObject);

self.responseObject = responseObject[@"token"];

[tcs setResult:responseObject];

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

NSLog(@"%@",error);

if (error) {

[tcs setError:error];

return;

}

}];

//同步

[tcs.task waitUntilFinished];

if (tcs.task.error) {

NSLog(@"get token error: %@", tcs.task.error);

return nil;

}

else {

//获取token返回的参数

OSSFederationToken * token = [OSSFederationToken new];

NSDictionary * dict = self.responseObject[@"Credentials"];

token.tAccessKey = [dict objectForKey:@"AccessKeyId"];

token.tSecretKey = [dict objectForKey:@"AccessKeySecret"];

token.tToken = [dict objectForKey:@"SecurityToken"];

token.expirationTimeInGMTFormat = [dict objectForKey:@"Expiration"];

NSLog(@"get token: %@", token);

return token;

}

}];

OSSClientConfiguration * conf = [OSSClientConfiguration new];

conf.maxRetryCount = 1;

conf.maxConcurrentRequestCount = 1;

conf.timeoutIntervalForRequest = 30;

conf.timeoutIntervalForResource = 24 * 60 * 60;

clients = [[OSSClient alloc] initWithEndpoint:endPoints credentialProvider:credential2 clientConfiguration:conf];

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355

推荐阅读更多精彩内容