123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- //
- // RNAliyunOSS+MULTIPARTUPLOAD.m
- // aliyun-oss-rn-sdk
- // Created by 罗章 on 2018/5/10.
-
- #import "RNAliyunOSS+MULTIPARTUPLOAD.h"
-
- @implementation RNAliyunOSS (MULTIPARTUPLOAD)
-
- /*
- *initMultipartUpload
- */
- RCT_REMAP_METHOD(initMultipartUpload,withBucketName:(NSString *)bucketName objectKey:(NSString *)objectKey resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
- /**init mulitpart*/
- __block NSString * uploadId = nil;
- NSString * uploadToBucket = bucketName;
- NSString * uploadObjectkey = objectKey;
- OSSInitMultipartUploadRequest * init = [OSSInitMultipartUploadRequest new];
- init.bucketName = uploadToBucket;
- init.objectKey = uploadObjectkey;
- // init.contentType = @"application/octet-stream";
- OSSTask * initTask = [self.client multipartUploadInit:init];
- [initTask waitUntilFinished];
- if (!initTask.error) {
- OSSInitMultipartUploadResult * result = initTask.result;
- uploadId = result.uploadId;
- NSLog(@"initMultipartLoad success!");
- resolve(uploadId);
- } else {
- NSLog(@"multipart upload failed, error: %@", initTask.error);
- reject(@"Error",@"multipart upload failed",initTask.error);
- return;
- }
- }
-
- /*
- multipartUpload
- */
- RCT_REMAP_METHOD(multipartUpload, withBucketName:(NSString *)bucketName objectKey:(NSString *)objectKey uploadId:(NSString*)uploadId withFilePath:(NSString*)filePath options:(NSDictionary*)options resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject){
- __block NSMutableArray * partInfos = [NSMutableArray new];
- filePath = [NSHomeDirectory() stringByAppendingPathComponent:filePath];
- //分片上传数量
- int chuckCount = 2;
- //获取文件大小
- long fileSize;
- NSFileManager* manager =[NSFileManager defaultManager];
- if ([manager fileExistsAtPath:filePath]){
- fileSize = [[manager attributesOfItemAtPath:filePath error:nil]fileSize];
- }
- //分片大小
- uint64_t offset = fileSize/chuckCount;
-
- for (int i = 1; i <= chuckCount; i++) {
- OSSUploadPartRequest * uploadPart = [OSSUploadPartRequest new];
- uploadPart.bucketName = bucketName;
- uploadPart.objectkey = objectKey;
- uploadPart.uploadId = uploadId;
- uploadPart.partNumber = i; // part number start from 1
- NSFileHandle* readHandle = [NSFileHandle fileHandleForReadingAtPath:filePath];
- [readHandle seekToFileOffset:offset * (i -1)];
- NSData* data = [readHandle readDataOfLength:offset];
- uploadPart.uploadPartData = data;
- OSSTask * uploadPartTask = [self.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]];
- } else {
- NSLog(@"upload part error: %@", uploadPartTask.error);
- return;
- }
- }
- //完成分片上传
- OSSCompleteMultipartUploadRequest * complete = [OSSCompleteMultipartUploadRequest new];
- complete.bucketName = bucketName;
- complete.objectKey = objectKey;
- complete.uploadId = uploadId;
- complete.partInfos = partInfos;
- OSSTask * completeTask = [self.client completeMultipartUpload:complete];
- [[completeTask continueWithBlock:^id(OSSTask *task) {
- if (!task.error) {
- OSSCompleteMultipartUploadResult * result = task.result;
- NSLog(@"upload server success");
- resolve(@"upload server success");
- } else {
- NSLog(@"upload server failed",task.error);
- reject(@"Error",@"upload server failed",task.error);
- }
- return nil;
- }] waitUntilFinished];
- }
-
- /*
- * abortMultipartUpload
- */
- RCT_REMAP_METHOD(abortMultipartUpload,withBucketName: (NSString*)bucketName objectKey: (NSString*)objectKey uploadId:(NSString*)uploadId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject){
- OSSAbortMultipartUploadRequest * abort = [OSSAbortMultipartUploadRequest new];
- abort.bucketName = bucketName;
- abort.objectKey = objectKey;
- abort.uploadId = uploadId;
- OSSTask * abortTask = [self.client abortMultipartUpload:abort];
- [abortTask waitUntilFinished];
- if (!abortTask.error) {
- OSSAbortMultipartUploadResult * result = abortTask.result;
- // uploadId = result.uploadId;
- NSLog(@"abort success!");
- resolve(@"abort success");
- } else {
- NSLog(@"multipart upload failed, error: %@", abortTask.error);
- reject(@"Error",@"multipart upload failed",abortTask.error);
- return;
- }
- }
-
- /*
- * list parts
- */
- RCT_REMAP_METHOD(listParts, withBucketName:(NSString*)bucketName withObjectKey: (NSString*)objectKey uploadId:(NSString*)uploadId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
-
- OSSListPartsRequest * listParts = [OSSListPartsRequest new];
- listParts.bucketName = bucketName;
- listParts.objectKey = objectKey;
- listParts.uploadId = uploadId;
- OSSTask * listPartTask = [self.client listParts:listParts];
- [listPartTask continueWithBlock:^id(OSSTask *task) {
- if (!task.error) {
- NSLog(@"list part result success!");
- OSSListPartsResult * listPartResult = task.result;
- for (NSDictionary * partInfo in listPartResult.parts) {
- NSLog(@"each part: %@", partInfo);
- }
- resolve(@"listParst success");
- } else {
- NSLog(@"list part result error: %@", task.error);
- reject(@"Error",@"list part result error",task.error);
- }
- return nil;
- }];
- }
- @end
|