From bcc978bf567dfbea8b072e8d25221cf098b537f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=AE=87=E4=B8=9C?= Date: Sun, 28 Apr 2019 19:10:27 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=9B=B4=E6=96=B0Gradle=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/build.gradle | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 261655d..6f0f9f5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,22 +2,23 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:1.3.1' + classpath 'com.android.tools.build:gradle:3.4.0' } } apply plugin: 'com.android.library' android { - compileSdkVersion 23 - buildToolsVersion '27.0.3' + compileSdkVersion 28 + buildToolsVersion '28.0.3' defaultConfig { minSdkVersion 16 - targetSdkVersion 22 + targetSdkVersion 28 versionCode 1 versionName "1.0" } @@ -28,10 +29,11 @@ android { repositories { mavenCentral() + google() } dependencies { - compile 'com.facebook.react:react-native:+' - compile 'com.aliyun.dpa:oss-android-sdk:+' + implementation 'com.facebook.react:react-native:+' + implementation 'com.aliyun.dpa:oss-android-sdk:+' } \ No newline at end of file From bbf06f14d9b5fb25411ea4208ec15ce839c6feb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=AE=87=E4=B8=9C?= Date: Sun, 28 Apr 2019 19:11:12 +0800 Subject: [PATCH 2/7] =?UTF-8?q?Android=20asyncUpload=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0setCallbackParam=E5=92=8CsetCallbackVars?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/reactlibrary/AliyunUploadManager.java | 146 ++++++++---------- .../java/com/reactlibrary/utils/RNUtils.java | 30 ++++ 2 files changed, 97 insertions(+), 79 deletions(-) create mode 100644 android/src/main/java/com/reactlibrary/utils/RNUtils.java diff --git a/android/src/main/java/com/reactlibrary/AliyunUploadManager.java b/android/src/main/java/com/reactlibrary/AliyunUploadManager.java index 2d08bfa..cfa3a75 100644 --- a/android/src/main/java/com/reactlibrary/AliyunUploadManager.java +++ b/android/src/main/java/com/reactlibrary/AliyunUploadManager.java @@ -39,6 +39,7 @@ import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.reactlibrary.utils.FileUtils; +import com.reactlibrary.utils.RNUtils; import java.io.File; import java.io.FileInputStream; @@ -55,7 +56,6 @@ public class AliyunUploadManager { /** * AliyunUploadManager contructor - * @param oss */ public AliyunUploadManager(OSS oss) { mOSS = oss; @@ -63,14 +63,9 @@ public AliyunUploadManager(OSS oss) { /** * asyncUpload - * @param context - * @param bucketName - * @param ossFile - * @param sourceFile - * @param options - * @param promise */ - public void asyncUpload(final ReactContext context, String bucketName, String ossFile, String sourceFile, ReadableMap options, final Promise promise) { + public void asyncUpload(final ReactContext context, String bucketName, String ossFile, String sourceFile, + ReadableMap options, final Promise promise) { // Content to file:// start Uri selectedVideoUri = Uri.parse(sourceFile); @@ -80,10 +75,13 @@ public void asyncUpload(final ReactContext context, String bucketName, String os try { String[] proj = {MediaStore.Images.Media.DATA}; cursor = context.getCurrentActivity().getContentResolver().query(selectedVideoUri, proj, null, null, null); - if (cursor == null) sourceFile = selectedVideoUri.getPath(); - int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); - cursor.moveToFirst(); - sourceFile = cursor.getString(column_index); + if (cursor == null) { + sourceFile = selectedVideoUri.getPath(); + } else { + int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + cursor.moveToFirst(); + sourceFile = cursor.getString(column_index); + } } catch (Exception e) { sourceFile = FileUtils.getFilePathFromURI(context.getCurrentActivity(), selectedVideoUri); } finally { @@ -112,6 +110,14 @@ public void onProgress(PutObjectRequest request, long currentSize, long totalSiz } }); + if (options.hasKey("callbackParam")) { + put.setCallbackParam(RNUtils.convertMap(options.getMap("callbackParam"))); + } + + if (options.hasKey("callbackVars")) { + put.setCallbackVars(RNUtils.convertMap(options.getMap("callbackVars"))); + } + OSSAsyncTask task = mOSS.asyncPutObject(put, new OSSCompletedCallback() { @Override public void onSuccess(PutObjectRequest request, PutObjectResult result) { @@ -122,8 +128,9 @@ public void onSuccess(PutObjectRequest request, PutObjectResult result) { } @Override - public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { - PromiseExceptionManager.resolvePromiseException(clientExcepion,serviceException,promise); + public void onFailure(PutObjectRequest request, ClientException clientExcepion, + ServiceException serviceException) { + PromiseExceptionManager.resolvePromiseException(clientExcepion, serviceException, promise); } }); Log.d("AliyunOSS", "OSS uploadObjectAsync ok!"); @@ -131,13 +138,9 @@ public void onFailure(PutObjectRequest request, ClientException clientExcepion, /** * asyncAppendObject - * @param bucketName - * @param objectKey - * @param uploadFilePath - * @param options - * @param promise */ - public void asyncAppendObject(final ReactContext context,String bucketName,String objectKey,String uploadFilePath,ReadableMap options,final Promise promise) { + public void asyncAppendObject(final ReactContext context, String bucketName, String objectKey, + String uploadFilePath, ReadableMap options, final Promise promise) { // Content to file:// start Uri selectedVideoUri = Uri.parse(uploadFilePath); @@ -184,33 +187,31 @@ public void onProgress(AppendObjectRequest request, long currentSize, long total } }); - OSSAsyncTask task = mOSS.asyncAppendObject(append, new OSSCompletedCallback() { - @Override - public void onSuccess(AppendObjectRequest request, AppendObjectResult result) { - Log.d("AppendObject", "AppendSuccess"); - Log.d("NextPosition", "" + result.getNextPosition()); - WritableMap map = Arguments.createMap(); - map.putString("AppendObject","AppendSuccess"); - map.putDouble("NextPosition", result.getNextPosition()); - promise.resolve(map); - } - @Override - public void onFailure(AppendObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { - PromiseExceptionManager.resolvePromiseException(clientExcepion,serviceException,promise); - } - }); + OSSAsyncTask task = mOSS + .asyncAppendObject(append, new OSSCompletedCallback() { + @Override + public void onSuccess(AppendObjectRequest request, AppendObjectResult result) { + Log.d("AppendObject", "AppendSuccess"); + Log.d("NextPosition", "" + result.getNextPosition()); + WritableMap map = Arguments.createMap(); + map.putString("AppendObject", "AppendSuccess"); + map.putDouble("NextPosition", result.getNextPosition()); + promise.resolve(map); + } + + @Override + public void onFailure(AppendObjectRequest request, ClientException clientExcepion, + ServiceException serviceException) { + PromiseExceptionManager.resolvePromiseException(clientExcepion, serviceException, promise); + } + }); } /** * asyncResumableUpload - * - * @param bucketName - * @param objectKey - * @param uploadFilePath - * @param options - * @param promise */ - public void asyncResumableUpload(final ReactContext context, String bucketName, String objectKey, String uploadFilePath, ReadableMap options, final Promise promise) { + public void asyncResumableUpload(final ReactContext context, String bucketName, String objectKey, + String uploadFilePath, ReadableMap options, final Promise promise) { ResumableUploadRequest request = new ResumableUploadRequest(bucketName, objectKey, uploadFilePath); @@ -229,26 +230,26 @@ public void onProgress(ResumableUploadRequest request, long currentSize, long to } }); - OSSAsyncTask resumableTask = mOSS.asyncResumableUpload(request, new OSSCompletedCallback() { - @Override - public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) { - promise.resolve("resumableUpload success"); - } - - @Override - public void onFailure(ResumableUploadRequest request, ClientException clientExcepion, ServiceException serviceException) { - PromiseExceptionManager.resolvePromiseException(clientExcepion, serviceException, promise); - } - }); + OSSAsyncTask resumableTask = mOSS + .asyncResumableUpload(request, new OSSCompletedCallback() { + @Override + public void onSuccess(ResumableUploadRequest request, ResumableUploadResult result) { + promise.resolve("resumableUpload success"); + } + + @Override + public void onFailure(ResumableUploadRequest request, ClientException clientExcepion, + ServiceException serviceException) { + PromiseExceptionManager.resolvePromiseException(clientExcepion, serviceException, promise); + } + }); } /** * initMultipartUpload - * @param bucketName - * @param objectKey - * @param promise */ - public void initMultipartUpload(String bucketName,String objectKey,final Promise promise) { + public void initMultipartUpload(String bucketName, String objectKey, final Promise promise) { String uploadId; InitiateMultipartUploadRequest init = new InitiateMultipartUploadRequest(bucketName, objectKey); InitiateMultipartUploadResult initResult = null; @@ -267,15 +268,9 @@ public void initMultipartUpload(String bucketName,String objectKey,final Promise /** * multipartUpload - * @param context - * @param bucketName - * @param objectKey - * @param uploadId - * @param filepath - * @param options - * @param promise */ - public void multipartUpload(final ReactContext context,String bucketName, String objectKey, String uploadId,String filepath, ReadableMap options,final Promise promise) { + public void multipartUpload(final ReactContext context, String bucketName, String objectKey, String uploadId, + String filepath, ReadableMap options, final Promise promise) { Uri selectedVideoUri = Uri.parse(filepath); // 1. content uri -> file path @@ -309,7 +304,7 @@ public void multipartUpload(final ReactContext context,String bucketName, String long uploadedLength = 0; List partETags = new ArrayList(); // 保存分片上传的结果 while (uploadedLength < fileLength) { - int partLength = (int)Math.min(partSize, fileLength - uploadedLength); + int partLength = (int) Math.min(partSize, fileLength - uploadedLength); byte[] partData = new byte[0]; // 按照分片大小读取文件的一段内容 try { partData = IOUtils.readStreamAsBytesArray(input, partLength); @@ -334,7 +329,8 @@ public void multipartUpload(final ReactContext context,String bucketName, String currentIndex++; } - CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest(bucketName, objectKey,uploadId,partETags); + CompleteMultipartUploadRequest complete = new CompleteMultipartUploadRequest(bucketName, objectKey, uploadId, + partETags); CompleteMultipartUploadResult completeResult = null; try { completeResult = mOSS.completeMultipartUpload(complete); @@ -354,12 +350,8 @@ public void multipartUpload(final ReactContext context,String bucketName, String /** * abortMultipartUpload - * @param bucketName - * @param objectKey - * @param uploadId - * @param promise */ - public void abortMultipartUpload(String bucketName,String objectKey,String uploadId,final Promise promise) { + public void abortMultipartUpload(String bucketName, String objectKey, String uploadId, final Promise promise) { AbortMultipartUploadRequest abort = new AbortMultipartUploadRequest(bucketName, objectKey, uploadId); try { mOSS.abortMultipartUpload(abort); @@ -375,12 +367,8 @@ public void abortMultipartUpload(String bucketName,String objectKey,String uploa /** * listParts - * @param bucketName - * @param objectKey - * @param uploadId - * @param promise */ - public void listParts (String bucketName,String objectKey,String uploadId,final Promise promise) { + public void listParts(String bucketName, String objectKey, String uploadId, final Promise promise) { ListPartsRequest listParts = new ListPartsRequest(bucketName, objectKey, uploadId); ListPartsResult result = null; try { @@ -401,9 +389,9 @@ public void listParts (String bucketName,String objectKey,String uploadId,final Log.d("listParts", "lastModified: " + result.getParts().get(i).getLastModified()); Log.d("listParts", "partSize: " + result.getParts().get(i).getSize()); listPartsData.putInt("partNum" + i, result.getParts().get(i).getPartNumber()); - listPartsData.putString("partEtag"+i,result.getParts().get(i).getETag()); + listPartsData.putString("partEtag" + i, result.getParts().get(i).getETag()); // listPartsData.("lastModified" + i,result.getParts().get(i).getLastModified()); - listPartsData.putDouble("partSize"+i,result.getParts().get(i).getSize()); + listPartsData.putDouble("partSize" + i, result.getParts().get(i).getSize()); } promise.resolve(listPartsData); } diff --git a/android/src/main/java/com/reactlibrary/utils/RNUtils.java b/android/src/main/java/com/reactlibrary/utils/RNUtils.java new file mode 100644 index 0000000..32d7fda --- /dev/null +++ b/android/src/main/java/com/reactlibrary/utils/RNUtils.java @@ -0,0 +1,30 @@ +package com.reactlibrary.utils; + +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.ReadableMapKeySetIterator; +import com.facebook.react.bridge.ReadableType; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by kevin.bai on 2019-04-28. + */ +public class RNUtils { + /** + * 将ReadableMap对象转为Map对象,只支持String类型的value + * @param param + * @return + */ + public static Map convertMap(ReadableMap param){ + Map result = new HashMap<>(); + ReadableMapKeySetIterator iterator = param.keySetIterator(); + while(iterator.hasNextKey()){ + String key = iterator.nextKey(); + if (param.getType(key) == ReadableType.String){ + result.put(key, param.getString(key)); + } + } + return result; + } +} From c774f758b64cebaf9e04cee26aa649cab4e6ede2 Mon Sep 17 00:00:00 2001 From: Ma Shuai Date: Mon, 29 Apr 2019 15:52:21 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0put=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/RNAliyunOSS+UPLOAD.m | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/ios/RNAliyunOSS+UPLOAD.m b/ios/RNAliyunOSS+UPLOAD.m index d9373be..4964e51 100644 --- a/ios/RNAliyunOSS+UPLOAD.m +++ b/ios/RNAliyunOSS+UPLOAD.m @@ -19,6 +19,26 @@ @implementation RNAliyunOSS (UPLOAD) put.objectKey = objectKey; put.uploadingData = data; + if([[options allKeys] containsObject:@"callbackVars"]) { + if ([options[@"callbackVars"] isKindOfClass: [NSDictionary class]]) { + put.callbackVar = [options[@"callbackVars"]; + } else { + NSLog(@"callbackVars 类型需要为字典类型"); + } + } else { + NSLog(@"options未包含 callbackVars 字段"); + } + + if([[options allKeys] containsObject:@"callbackParam"]) { + if ([options[@"callbackParam"] isKindOfClass: [NSDictionary class]]) { + put.callbackParam = [options[@"callbackParam"]; + } else { + NSLog(@"callbackParam 类型需要为字典类型"); + } + } else { + NSLog(@"options未包含 callbackParam 字段"); + } + // 设置Content-Type,可选 // put.contentType = @"application/octet-stream"; // // 设置MD5校验,可选 From 96357264291a0a7d4979018930c7f2555b70f2b3 Mon Sep 17 00:00:00 2001 From: Ma Shuai Date: Mon, 29 Apr 2019 18:26:47 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E8=AF=AD=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/RNAliyunOSS+UPLOAD.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/RNAliyunOSS+UPLOAD.m b/ios/RNAliyunOSS+UPLOAD.m index 4964e51..9b4ba52 100644 --- a/ios/RNAliyunOSS+UPLOAD.m +++ b/ios/RNAliyunOSS+UPLOAD.m @@ -21,7 +21,7 @@ @implementation RNAliyunOSS (UPLOAD) if([[options allKeys] containsObject:@"callbackVars"]) { if ([options[@"callbackVars"] isKindOfClass: [NSDictionary class]]) { - put.callbackVar = [options[@"callbackVars"]; + put.callbackVar = options[@"callbackVars"]; } else { NSLog(@"callbackVars 类型需要为字典类型"); } @@ -31,7 +31,7 @@ @implementation RNAliyunOSS (UPLOAD) if([[options allKeys] containsObject:@"callbackParam"]) { if ([options[@"callbackParam"] isKindOfClass: [NSDictionary class]]) { - put.callbackParam = [options[@"callbackParam"]; + put.callbackParam = options[@"callbackParam"]; } else { NSLog(@"callbackParam 类型需要为字典类型"); } From 01665fcd2ee42bd5030640a5a912ff658349d258 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=AE=87=E4=B8=9C?= Date: Tue, 30 Apr 2019 10:04:04 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a840e96..43308e9 100644 --- a/README.md +++ b/README.md @@ -242,9 +242,16 @@ AliyunOSS.initWithServerSTS(/*local auth server*/, endPoint, configuration); ### asyncUpload +```javascript +const option = { + // optional + callbackParam:{}, + // optional + callbackVars:{}, +} +AliyunOSS.asyncUpload(bucketname, objectKey, filepath, option).then().catch() ``` -AliyunOSS.asyncUpload(bucketname, objectKey, filepath).then().catch() -``` +callbackParam与callbackVars参数格式请参考[阿里云文档](https://help.aliyun.com/document_detail/31989.html?spm=a2c4g.11186623.6.703.395472c1fxLRVz) ### asyncAppendObject ### asyncResumableUpload ### initMultipartUpload From 85349544e3376315197fc2f1b7b4dd328e3a5763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=AE=87=E4=B8=9C?= Date: Tue, 30 Apr 2019 11:30:30 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E5=B1=8F=E8=94=BDiOS?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E6=8A=A5=E9=94=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ios/RNAliyunOSS+AUTH.m | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ios/RNAliyunOSS+AUTH.m b/ios/RNAliyunOSS+AUTH.m index 1bfcc6d..cc43984 100644 --- a/ios/RNAliyunOSS+AUTH.m +++ b/ios/RNAliyunOSS+AUTH.m @@ -65,14 +65,14 @@ @implementation RNAliyunOSS (AUTH) /** initWithServerSTS */ -RCT_EXPORT_METHOD(initWithServerSTS:(NSString *)server endPoint:(NSString *)endPoint configuration:(NSDictionary *)configuration){ - //直接访问鉴权服务器(推荐,token过期后可以自动更新) - id credential = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:server]; +// RCT_EXPORT_METHOD(initWithServerSTS:(NSString *)server endPoint:(NSString *)endPoint configuration:(NSDictionary *)configuration){ +// //直接访问鉴权服务器(推荐,token过期后可以自动更新) +// id credential = [[OSSAuthCredentialProvider alloc] initWithAuthServerUrl:server]; - [self initConfiguration: configuration]; +// [self initConfiguration: configuration]; - self.client = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential clientConfiguration:self.clientConfiguration]; -} +// self.client = [[OSSClient alloc] initWithEndpoint:endPoint credentialProvider:credential clientConfiguration:self.clientConfiguration]; +// } @end From 1c7da550eb86a3dba5e356912ac3ac214248d2b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=AE=87=E4=B8=9C?= Date: Mon, 27 May 2019 16:42:51 +0800 Subject: [PATCH 7/7] Android asyncUpload add progressStep support --- .../com/reactlibrary/AliyunUploadManager.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/com/reactlibrary/AliyunUploadManager.java b/android/src/main/java/com/reactlibrary/AliyunUploadManager.java index cfa3a75..d8d47b2 100644 --- a/android/src/main/java/com/reactlibrary/AliyunUploadManager.java +++ b/android/src/main/java/com/reactlibrary/AliyunUploadManager.java @@ -95,18 +95,26 @@ public void asyncUpload(final ReactContext context, String bucketName, String os metadata.setContentType("application/octet-stream"); put.setMetadata(metadata); + final int progressStep = options.hasKey("progressStep") ? options.getInt("progressStep") : 0; + // set callback put.setProgressCallback(new OSSProgressCallback() { + double lastPercent = 0; + @Override public void onProgress(PutObjectRequest request, long currentSize, long totalSize) { Log.d("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize); - String str_currentSize = Long.toString(currentSize); - String str_totalSize = Long.toString(totalSize); - WritableMap onProgressValueData = Arguments.createMap(); - onProgressValueData.putString("currentSize", str_currentSize); - onProgressValueData.putString("totalSize", str_totalSize); - context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("uploadProgress", onProgressValueData); + double percent = currentSize * 100.0 / totalSize; + if (percent - lastPercent >= progressStep) { + String str_currentSize = Long.toString(currentSize); + String str_totalSize = Long.toString(totalSize); + WritableMap onProgressValueData = Arguments.createMap(); + onProgressValueData.putString("currentSize", str_currentSize); + onProgressValueData.putString("totalSize", str_totalSize); + context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit("uploadProgress", onProgressValueData); + lastPercent = percent; + } } });