• 断点续传和分块上传


    #pragma mark   异步上传

    - (void)uploadObjectAsync:(NSString *)FileURL objectKey:(NSString *)objectKey{

        OSSPutObjectRequest * put = [OSSPutObjectRequest new];

        NSLog(@"objectKey is %@",objectKey);

        // required fields

        put.bucketName = bucketName;

        put.objectKey = objectKey;

        put.uploadingFileURL = [NSURL fileURLWithPath:FileURL];

        

        // optional fields

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

            

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

            dispatch_async(dispatch_get_main_queue(), ^{

                float  gress = (double)totalByteSent/totalBytesExpectedToSend;

                if([self.dclickDelegate respondsToSelector:@selector(WaveProgressPlus:)]){

                    [self.dclickDelegate performSelector:@selector(WaveProgressPlus:) withObject:@(gress)];

                    NSLog(@"gress123上传中");

                }

            });

         

        };

        

        OSSTask * putTask = [client putObject:put];

        

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

            NSLog(@" putTask  :%@",putTask.result);

            NSLog(@"objectKey: %@", put.objectKey);

            uploadputkey = put.objectKey;

            if (!task.error) {

                NSLog(@"upload object success!");

                if([self.dclickDelegate respondsToSelector:@selector(dissbackView)]){

                    [self.dclickDelegate performSelector:@selector(dissbackView)];

                }

                [self signAccessObjectURL];

            } else {

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

            }

            return nil;

        }];

    }

    #pragma mark  同步上传

    - (void)uploadObjectSync:(NSString *)FileURL objectKey:(NSString *)objectKey {

        OSSPutObjectRequest * put = [OSSPutObjectRequest new];

        

        // required fields

        put.bucketName = bucketName;

        put.objectKey = objectKey;

        put.uploadingFileURL = [NSURL fileURLWithPath:FileURL];

        // optional fields

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

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

            

            dispatch_async(dispatch_get_main_queue(), ^{

                float  gress = totalByteSent/totalBytesExpectedToSend;

                if([self.dclickDelegate respondsToSelector:@selector(WaveProgressPlus:)]){

                    [self.dclickDelegate performSelector:@selector(WaveProgressPlus:) withObject:@(gress)];

                    NSLog(@"gress123");

                }

            });

            

        };

        OSSTask * putTask = [client putObject:put];

        

        [putTask waitUntilFinished]; // 阻塞直到上传完成

        

        NSLog(@" putTask  :%@",putTask.result);

        if (!putTask.error) {

            NSLog(@"upload object success!");

            NSLog(@" putTask  :%@",putTask.result);

            NSLog(@"objectKey: %@", put.objectKey);

            uploadputkey = put.objectKey;

            if([self.dclickDelegate respondsToSelector:@selector(dissbackView)]){

                [self.dclickDelegate performSelector:@selector(dissbackView)];

            }

            [self signAccessObjectURL];

            

        } else {

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

        }

        

    }

    #pragma mark  追加上传

    - (void)appendObject {

        OSSAppendObjectRequest * append = [OSSAppendObjectRequest new];

        

        // 必填字段

        append.bucketName = @"android-test";

        append.objectKey = @"file1m";

        append.appendPosition = 0; // 指定从何处进行追加

        NSString * docDir = [self getDocumentDirectory];

        append.uploadingFileURL = [NSURL fileURLWithPath:[docDir stringByAppendingPathComponent:@"file1m"]];

        

        // 可选字段

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

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

        };

        // append.contentType = @"";

        // append.contentMd5 = @"";

        // append.contentEncoding = @"";

        // append.contentDisposition = @"";

        

        OSSTask * appendTask = [client appendObject:append];

         NSLog(@" putTask  :%@",appendTask.result);

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

            NSLog(@"objectKey: %@", append.objectKey);

            if (!task.error) {

                NSLog(@"append object success!");

                OSSAppendObjectResult * result = task.result;

                NSString * etag = result.eTag;

                long nextPosition = result.xOssNextAppendPosition;

                NSLog(@"etag: %@, nextPosition: %ld", etag, nextPosition);

            } else {

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

            }

            return nil;

        }];

    }

    #pragma mark  异步下载

    - (void)downloadObjectAsync {

        OSSGetObjectRequest * request = [OSSGetObjectRequest new];

        // required

        request.bucketName = @"android-test";

        request.objectKey = @"file1m";

        

        //optional

        request.downloadProgress = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {

            NSLog(@"%lld, %lld, %lld", bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);

         

        };

       

        

        OSSTask * getTask = [client getObject:request];

        

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

            if (!task.error) {

                NSLog(@"download object success!");

                OSSGetObjectResult * getResult = task.result;

                NSLog(@"download dota length: %lu", [getResult.downloadedData length]);

                

            } else {

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

            }

            return nil;

        }];

    }

    #pragma mark   同步下载

    - (void)downloadObjectSync {

        OSSGetObjectRequest * request = [OSSGetObjectRequest new];

        // required

        request.bucketName = @"android-test";

        request.objectKey = @"file1m";

        

        //optional

        request.downloadProgress = ^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {

            NSLog(@"%lld, %lld, %lld", bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);

        };

        // NSString * docDir = [self getDocumentDirectory];

        // request.downloadToFileURL = [NSURL fileURLWithPath:[docDir stringByAppendingPathComponent:@"downloadfile"]];

        

        OSSTask * getTask = [client getObject:request];

        

        [getTask waitUntilFinished];

        

        if (!getTask.error) {

            OSSGetObjectResult * result = getTask.result;

            NSLog(@"download data length: %lu", [result.downloadedData length]);

        } else {

            NSLog(@"download data error: %@", getTask.error);

        }

    }

    #pragma mark   获取meta

    - (void)headObject {

        OSSHeadObjectRequest * head = [OSSHeadObjectRequest new];

        head.bucketName = @"android-test";

        head.objectKey = @"file1m";

        

        OSSTask * headTask = [client headObject:head];

        

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

            if (!task.error) {

                OSSHeadObjectResult * headResult = task.result;

                NSLog(@"all response header: %@", headResult.httpResponseHeaderFields);

                

                // some object properties include the 'x-oss-meta-*'s

                NSLog(@"head object result: %@", headResult.objectMeta);

            } else {

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

            }

            return nil;

        }];

    }

    #pragma mark   删除Object

    - (void)deleteObject {

        OSSDeleteObjectRequest * delete = [OSSDeleteObjectRequest new];

        delete.bucketName = @"android-test";

        delete.objectKey = @"file1m";

        

        OSSTask * deleteTask = [client deleteObject:delete];

        

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

            if (!task.error) {

                NSLog(@"delete success !");

            } else {

                NSLog(@"delete erorr, error: %@", task.error);

            }

            return nil;

        }];

    }

    #pragma mark   复制Object

    - (void)copyObjectAsync {

        OSSCopyObjectRequest * copy = [OSSCopyObjectRequest new];

        copy.bucketName = @"android-test"; // 复制到哪个bucket

        copy.objectKey = @"file_copy_to"; // 复制为哪个object

        copy.sourceCopyFrom = [NSString stringWithFormat:@"/%@/%@", @"android-test", @"file1m"]; // 从哪里复制

        

        OSSTask * copyTask = [client copyObject:copy];

        

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

            if (!task.error) {

                NSLog(@"copy success!");

            } else {

                NSLog(@"copy error, error: %@", task.error);

            }

            return nil;

        }];

    }

    #pragma mark  签名URL授予第三方访问

    - (void)signAccessObjectURL {

        NSString * constrainURL = nil;

        NSString * publicURL = nil;

        

        // sign constrain url

        OSSTask * task = [client presignConstrainURLWithBucketName:bucketName

                                                     withObjectKey:uploadputkey

                                            withExpirationInterval:60 * 30];

    //    if (!task.error) {

    //        constrainURL = task.result;

    //        NSLog(@"constrainURL is %@",constrainURL);

    //        postPublicURL = publicURL;

    //        [self createTranscodeJobFlow];

    //    } else {

    //        NSLog(@"error: %@", task.error);

    //    }

        

        // sign public url

        task = [client presignPublicURLWithBucketName:bucketName

                                        withObjectKey:uploadputkey];

        if (!task.error) {

            publicURL = task.result;

            NSLog(@"publicURL is %@",publicURL);

            postPublicURL = publicURL;

            [self createTranscodeJobFlow];

        } else {

            NSLog(@"sign url error: %@", task.error);

        }

    }

    #pragma mark   分块上传

    - (void)multipartUpload:(NSString *)FileURL objectKey:(NSString *)objectKey{

        

        __block NSString * uploadId = nil;

        __block NSMutableArray * partInfos = [NSMutableArray new];

        

        NSString * uploadToBucket = bucketName;

        NSString * uploadObjectkey = objectKey;

        

        OSSInitMultipartUploadRequest * init = [OSSInitMultipartUploadRequest new];

        init.bucketName = uploadToBucket;

        init.objectKey = uploadObjectkey;

        init.contentType = @"video/x-m4v";

        init.objectMeta = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"x-oss-meta-name1", nil];

        

        OSSTask * initTask = [client multipartUploadInit:init];

        

        [initTask waitUntilFinished];

        

        if (!initTask.error) {

            OSSInitMultipartUploadResult * result = initTask.result;

            MUuploadID = result.uploadId;

            uploadputkey =objectKey;

           

            NSLog(@"init multipart upload success: %@", result.uploadId);

        } else {

            NSLog(@"multipart upload failed, error: %@", initTask.error);

            return;

        }

        NSDictionary * pathsize =  [self getVideoInfoWithSourcePath:FileURL];

        NSInteger videoSize = [pathsize[@"size"]integerValue];

        

        //要上传的文件

        chuckCount = 100; // 10块 好区分图谱

        //分片上传数量

        uint64_t offset = videoSize/chuckCount;

        

        for (int i = 1; i <= chuckCount; i++) {

            @autoreleasepool {

                OSSUploadPartRequest * uploadPart = [OSSUploadPartRequest new];

                uploadPart.bucketName = uploadToBucket;

                uploadPart.objectkey = uploadObjectkey;

                uploadPart.uploadId = uploadId;

                uploadPart.partNumber = i; // part number start from 1

                

                NSString * docDir = FileURL;

                uploadPart.uploadPartFileURL = [NSURL URLWithString:docDir];

                NSFileHandle* readHandle = [NSFileHandle fileHandleForReadingAtPath:FileURL];

                [readHandle seekToFileOffset:offset * (i -1)];

                NSData* data = [readHandle readDataOfLength:offset];

                uploadPart.uploadPartData = data;

                

    //            uploadPart.uploadPartProgress = ^(int64_t bytesSent, int64_t totalBytesSent, int64_t totalBytesExpectedToSend) {

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

    //                dispatch_async(dispatch_get_main_queue(), ^{

    //                    float  gress = (double)totalBytesSent/totalBytesExpectedToSend;

    //                    if([self.dclickDelegate respondsToSelector:@selector(WaveProgressPlus:)]){

    //                        [self.dclickDelegate performSelector:@selector(WaveProgressPlus:) withObject:@(gress)];

    //                        NSLog(@"gress123上传中");

    //                    }

    //                });

    //            };

                

                OSSTask * uploadPartTask = [client uploadPart:uploadPart];

                

                [uploadPartTask waitUntilFinished];

                

                if (!uploadPartTask.error) {

                    OSSUploadPartResult * result = uploadPartTask.result;

                    uint64_t fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:uploadPart.uploadPartFileURL.absoluteString error:nil] fileSize];

                    [partInfos addObject:[OSSPartInfo partInfoWithPartNum:i eTag:result.eTag size:fileSize]];

                    

                     [self listParts:MUuploadID PartNumber:uploadPart.partNumber];

                } else {

                    NSLog(@"upload part error: %@", uploadPartTask.error);

                    return;

                }

            }

        }

        

    //    OSSCompleteMultipartUploadRequest * complete = [OSSCompleteMultipartUploadRequest new];

    //    complete.bucketName = uploadToBucket;

    //    complete.objectKey = uploadObjectkey;

    //    complete.uploadId = uploadId;

    //    complete.partInfos = partInfos;

    //

    //    OSSTask * completeTask = [client completeMultipartUpload:complete];

    //

    //    [completeTask waitUntilFinished];

    //

    //    if (!completeTask.error) {

    //        NSLog(@"multipart upload success!");

    //

    //    } else {

    //        NSLog(@"multipart upload failed, error: %@", completeTask.error);

    //        return;

    //    }

    }

    #pragma mark  罗列分块

    - (void)listParts:(NSString *)uploadId PartNumber:(int)partNumber{

        OSSListPartsRequest * listParts = [OSSListPartsRequest new];

        listParts.bucketName = bucketName;

        listParts.objectKey = uploadputkey;

        listParts.uploadId = uploadId;

        

        OSSTask * listPartTask = [client listParts:listParts];

        

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

            if (!task.error) {

                NSLog(@"list part result success!");

                OSSListPartsResult * listPartResult = task.result;

                

                dispatch_async(dispatch_get_main_queue(), ^{

                    float  gress = (double)partNumber/chuckCount;

                    if([self.dclickDelegate respondsToSelector:@selector(WaveProgressPlus:)]){

                        [self.dclickDelegate performSelector:@selector(WaveProgressPlus:) withObject:@(gress)];

                        NSLog(@"gress123上传中");

                    }

                    if (gress == 1.0) {

                  if([self.dclickDelegate respondsToSelector:@selector(dissbackView)]){

                            [self.dclickDelegate performSelector:@selector(dissbackView)];

                  }

                        [self signAccessObjectURL];

                    }

                });

                

                NSLog(@"listPartResult is%@",listPartResult);

                

                

                for (NSDictionary * partInfo in listPartResult.parts) {

                    NSLog(@"partInfoeachpart: %@", partInfo);

                }

                

            } else {

                NSLog(@"list part result error: %@", task.error);

            }

            return nil;

        }];

    }

    #pragma mark ----// 断点续传 ----

    - (void)resumableUpload:(NSString *)FileURL objectKey:(NSString *)objectKey{

        __block NSString * recordKey;

        

    //    NSString * docDir = [self getDocumentDirectory];

        NSString * filePath =FileURL;

    //    NSString * bucketName = bucketName;

    //    objectKey = @"uploadKey";

        

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

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

            NSURL * fileURL = [NSURL fileURLWithPath:filePath];

            NSDate * lastModified;

            NSError * error;

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

            if (error) {

                return [OSSTask taskWithError:error];

            }

            recordKey = [NSString stringWithFormat:@"%@-%@-%@-%@", bucketName, objectKey, [OSSUtil getRelativePath:filePath], 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 = @"video/x-m4v";

                return [client 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上传文件

            _resumableUpload = [OSSResumableUploadRequest new];

            _resumableUpload.bucketName = bucketName;

            _resumableUpload.objectKey = objectKey;

            _resumableUpload.uploadId = task.result;

            _resumableUpload.uploadingFileURL = [NSURL fileURLWithPath:filePath];

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

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

                

                    dispatch_async(dispatch_get_main_queue(), ^{

                        float  gress = (double)totalBytesSent/totalBytesExpectedToSend;

                        if([self.dclickDelegate respondsToSelector:@selector(WaveProgressPlus:)]){

                            [self.dclickDelegate performSelector:@selector(WaveProgressPlus:) withObject:@(gress)];

                            NSLog(@"gress123上传中");

                        }

                    });

            };

            return [client 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(@"%@",task.result);

                NSLog(@"%@",self->_resumableUpload.objectKey);

                NSLog(@"upload completed!");

                 uploadputkey = _resumableUpload.objectKey;

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

                [[NSUserDefaults standardUserDefaults] removeObjectForKey:recordKey];

                NSLog(@"upload object success!");

                if([self.dclickDelegate respondsToSelector:@selector(dissbackView)]){

                    [self.dclickDelegate performSelector:@selector(dissbackView)];

                }

                [self signAccessObjectURL];

            }

            return nil;

        }];

    }

    -(void)cannelUpdate{

        [_resumableUpload cancel];

    //    _resumableUpload = nil;

        NSLog(@"取消网络操作");

    //    [OSSTask cancelledTask];

    }

    #pragma mark --检查数据大小---

    - (NSDictionary *)getVideoInfoWithSourcePath:(NSString *)path{

        NSLog(@"%@",path);

        

        AVURLAsset * asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:path]];

        CMTime   time = [asset duration];

        int seconds = ceil(time.value/time.timescale);

        

        NSInteger   fileSize = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil].fileSize;

        return @{@"size" : @(fileSize),

                 @"duration" : @(seconds)};

    }

  • 相关阅读:
    【ASP.NET】website转webapplication
    【.net】ASP.Net设置和取消设置web项目起始页
    【.net】“Newtonsoft.Json”已拥有为“Microsoft.CSharp”定义的依赖项。
    snmp简单使用
    saltstack系列2之zabbix-agent自动化部署
    saltstack系列1之salt-api配置与使用
    python06 深浅拷贝原理
    python05
    level 1 -- unit 4 -- where 引导的疑问句
    level1 -- unit 3
  • 原文地址:https://www.cnblogs.com/tangyuanby2/p/8358925.html
Copyright © 2020-2023  润新知