From b155e0033201bbf37bad0e1caf2b43eefddc6df0 Mon Sep 17 00:00:00 2001 From: ws Date: Tue, 13 Sep 2022 13:01:52 +0800 Subject: [PATCH 1/2] Add api of GetObjectMeta --- .../alibaba/sdk/android/ManageObjectTest.java | 21 ++++++++++++++ .../java/com/alibaba/sdk/android/oss/OSS.java | 21 ++++++++++++++ .../alibaba/sdk/android/oss/OSSClient.java | 12 ++++++++ .../com/alibaba/sdk/android/oss/OSSImpl.java | 12 ++++++++ .../android/oss/common/RequestParameters.java | 1 + .../android/oss/common/utils/OSSUtils.java | 3 +- .../internal/InternalRequestOperation.java | 26 +++++++++++++++++ .../android/oss/internal/ResponseParsers.java | 10 +++++++ .../oss/model/GetObjectMetaRequest.java | 29 +++++++++++++++++++ .../oss/model/GetObjectMetaResult.java | 14 +++++++++ 10 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/GetObjectMetaRequest.java create mode 100644 oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/GetObjectMetaResult.java diff --git a/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/ManageObjectTest.java b/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/ManageObjectTest.java index b71e6e1b..4281ff1c 100644 --- a/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/ManageObjectTest.java +++ b/oss-android-sdk/src/androidTest/java/com/alibaba/sdk/android/ManageObjectTest.java @@ -9,6 +9,8 @@ import com.alibaba.sdk.android.oss.model.CreateBucketRequest; import com.alibaba.sdk.android.oss.model.DeleteObjectRequest; import com.alibaba.sdk.android.oss.model.DeleteObjectResult; +import com.alibaba.sdk.android.oss.model.GetObjectMetaRequest; +import com.alibaba.sdk.android.oss.model.GetObjectMetaResult; import com.alibaba.sdk.android.oss.model.HeadObjectRequest; import com.alibaba.sdk.android.oss.model.HeadObjectResult; import com.alibaba.sdk.android.oss.model.ListObjectsRequest; @@ -288,6 +290,25 @@ public void testHeadObject() throws Exception { assertEquals(1024 * 1000, headResult.getMetadata().getContentLength()); } + @Test + public void testGetObjectMeta() throws Exception { + GetObjectMetaRequest getObjectMeta = new GetObjectMetaRequest(mBucketName, "file1m"); + GetObjectMetaResult getObjectMetaResult = oss.getObjectMeta(getObjectMeta); + + assertNotNull(getObjectMetaResult.getMetadata().getETag()); + assertNotNull(getObjectMetaResult.getMetadata().getLastModified()); + assertEquals(1024 * 1000, getObjectMetaResult.getMetadata().getContentLength()); + + PutObjectRequest file1m = new PutObjectRequest(mBucketName, + "file1m.txt", filePath); + oss.putObject(file1m); + + getObjectMeta = new GetObjectMetaRequest(mBucketName, "file1m.txt"); + getObjectMetaResult = oss.getObjectMeta(getObjectMeta); + + assertEquals(1024 * 1000, getObjectMetaResult.getMetadata().getContentLength()); + } + @Test public void testDoesObjectExist() throws Exception { diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSS.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSS.java index 666ff86c..c5dfcf73 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSS.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSS.java @@ -195,6 +195,27 @@ public OSSAsyncTask asyncHeadObject( public HeadObjectResult headObject(HeadObjectRequest request) throws ClientException, ServiceException; + /** + * Asynchronously queries the metadata of an object, including ETag, Size, and LastModified. + * The content of the object is not returned. + * + * @param request + * @param completedCallback + * @return + */ + public OSSAsyncTask asyncGetObjectMeta(GetObjectMetaRequest request, OSSCompletedCallback completedCallback); + + /** + * Synchronously queries the metadata of an object, including ETag, Size, and LastModified. + * The content of the object is not returned. + * + * @param request + * @return + * @throws ClientException + * @throws ServiceException + */ + public GetObjectMetaResult getObjectMeta(GetObjectMetaRequest request) throws ClientException, ServiceException; + /** * Asynchronously copy a file * It copies an existing file to another one. diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSSClient.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSSClient.java index 93631b27..aa407080 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSSClient.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSSClient.java @@ -16,6 +16,8 @@ import com.alibaba.sdk.android.oss.model.AbortMultipartUploadResult; import com.alibaba.sdk.android.oss.model.AppendObjectRequest; import com.alibaba.sdk.android.oss.model.AppendObjectResult; +import com.alibaba.sdk.android.oss.model.GetObjectMetaRequest; +import com.alibaba.sdk.android.oss.model.GetObjectMetaResult; import com.alibaba.sdk.android.oss.model.ResumableDownloadResult; import com.alibaba.sdk.android.oss.model.CompleteMultipartUploadRequest; import com.alibaba.sdk.android.oss.model.CompleteMultipartUploadResult; @@ -360,6 +362,16 @@ public HeadObjectResult headObject(HeadObjectRequest request) return mOss.headObject(request); } + @Override + public OSSAsyncTask asyncGetObjectMeta(GetObjectMetaRequest request, OSSCompletedCallback completedCallback) { + return mOss.asyncGetObjectMeta(request, completedCallback); + } + + @Override + public GetObjectMetaResult getObjectMeta(GetObjectMetaRequest request) throws ClientException, ServiceException { + return mOss.getObjectMeta(request); + } + @Override public OSSAsyncTask asyncCopyObject(CopyObjectRequest request, OSSCompletedCallback completedCallback) { diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSSImpl.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSSImpl.java index 3690be0f..9ed40534 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSSImpl.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/OSSImpl.java @@ -21,6 +21,8 @@ import com.alibaba.sdk.android.oss.model.AbortMultipartUploadResult; import com.alibaba.sdk.android.oss.model.AppendObjectRequest; import com.alibaba.sdk.android.oss.model.AppendObjectResult; +import com.alibaba.sdk.android.oss.model.GetObjectMetaRequest; +import com.alibaba.sdk.android.oss.model.GetObjectMetaResult; import com.alibaba.sdk.android.oss.model.ResumableDownloadResult; import com.alibaba.sdk.android.oss.model.CompleteMultipartUploadRequest; import com.alibaba.sdk.android.oss.model.CompleteMultipartUploadResult; @@ -391,6 +393,16 @@ public HeadObjectResult headObject(HeadObjectRequest request) return internalRequestOperation.headObject(request, null).getResult(); } + @Override + public OSSAsyncTask asyncGetObjectMeta(GetObjectMetaRequest request, OSSCompletedCallback completedCallback) { + return internalRequestOperation.getObjectMeta(request, completedCallback); + } + + @Override + public GetObjectMetaResult getObjectMeta(GetObjectMetaRequest request) throws ClientException, ServiceException { + return internalRequestOperation.getObjectMeta(request, null).getResult(); + } + @Override public OSSAsyncTask asyncCopyObject(CopyObjectRequest request, OSSCompletedCallback completedCallback) { diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/RequestParameters.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/RequestParameters.java index 8909d7db..ab2e644e 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/RequestParameters.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/RequestParameters.java @@ -33,6 +33,7 @@ public final class RequestParameters { public static final String SUBRESOURCE_CORS = "cors"; public static final String SUBRESOURCE_APPEND = "append"; public static final String SUBRESOURCE_SEQUENTIAL = "sequential"; + public static final String SUBRESOURCE_OBJECT_META = "objectMeta"; public static final String PREFIX = "prefix"; diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/OSSUtils.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/OSSUtils.java index 280f6e9d..7ec21dc3 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/OSSUtils.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/common/utils/OSSUtils.java @@ -81,6 +81,7 @@ import static com.alibaba.sdk.android.oss.common.RequestParameters.SUBRESOURCE_LIFECYCLE; import static com.alibaba.sdk.android.oss.common.RequestParameters.SUBRESOURCE_LOCATION; import static com.alibaba.sdk.android.oss.common.RequestParameters.SUBRESOURCE_LOGGING; +import static com.alibaba.sdk.android.oss.common.RequestParameters.SUBRESOURCE_OBJECT_META; import static com.alibaba.sdk.android.oss.common.RequestParameters.SUBRESOURCE_REFERER; import static com.alibaba.sdk.android.oss.common.RequestParameters.SUBRESOURCE_SEQUENTIAL; import static com.alibaba.sdk.android.oss.common.RequestParameters.SUBRESOURCE_UPLOADS; @@ -106,7 +107,7 @@ public class OSSUtils { RESPONSE_HEADER_CACHE_CONTROL, RESPONSE_HEADER_CONTENT_DISPOSITION, RESPONSE_HEADER_CONTENT_ENCODING, RESPONSE_HEADER_CONTENT_LANGUAGE, RESPONSE_HEADER_CONTENT_TYPE, RESPONSE_HEADER_EXPIRES, X_OSS_PROCESS, - SUBRESOURCE_SEQUENTIAL, X_OSS_SYMLINK, X_OSS_RESTORE + SUBRESOURCE_SEQUENTIAL, X_OSS_SYMLINK, X_OSS_RESTORE, SUBRESOURCE_OBJECT_META }); /** diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/InternalRequestOperation.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/InternalRequestOperation.java index b4bb5b2a..777700df 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/InternalRequestOperation.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/InternalRequestOperation.java @@ -562,6 +562,32 @@ public OSSAsyncTask headObject( return OSSAsyncTask.wrapRequestTask(executorService.submit(callable), executionContext); } + public OSSAsyncTask getObjectMeta(GetObjectMetaRequest request, OSSCompletedCallback completedCallback) { + + Map query = new LinkedHashMap(); + query.put("objectMeta", ""); + + RequestMessage requestMessage = new RequestMessage(); + requestMessage.setIsAuthorizationRequired(request.isAuthorizationRequired()); + requestMessage.setEndpoint(endpoint); + requestMessage.setMethod(HttpMethod.HEAD); + requestMessage.setBucketName(request.getBucketName()); + requestMessage.setObjectKey(request.getObjectKey()); + requestMessage.setParameters(query); + + canonicalizeRequestMessage(requestMessage, request); + + ExecutionContext executionContext = new ExecutionContext(getInnerClient(), request, applicationContext); + if (completedCallback != null) { + executionContext.setCompletedCallback(completedCallback); + } + ResponseParser parser = new ResponseParsers.GetObjectMetaResponseParser(); + + Callable callable = new OSSRequestTask(requestMessage, parser, executionContext, maxRetryCount); + + return OSSAsyncTask.wrapRequestTask(executorService.submit(callable), executionContext); + } + public OSSAsyncTask getObject( GetObjectRequest request, OSSCompletedCallback completedCallback) { diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResponseParsers.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResponseParsers.java index c893c3d4..666fff72 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResponseParsers.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResponseParsers.java @@ -26,6 +26,7 @@ import com.alibaba.sdk.android.oss.model.GetBucketLifecycleResult; import com.alibaba.sdk.android.oss.model.GetBucketLoggingResult; import com.alibaba.sdk.android.oss.model.GetObjectACLResult; +import com.alibaba.sdk.android.oss.model.GetObjectMetaResult; import com.alibaba.sdk.android.oss.model.GetObjectResult; import com.alibaba.sdk.android.oss.model.GetSymlinkResult; import com.alibaba.sdk.android.oss.model.HeadObjectResult; @@ -898,6 +899,15 @@ public HeadObjectResult parseData(ResponseMessage response, HeadObjectResult res } } + public static final class GetObjectMetaResponseParser extends AbstractResponseParser { + + @Override + public GetObjectMetaResult parseData(ResponseMessage response, GetObjectMetaResult result) throws Exception { + result.setMetadata(parseObjectMetadata(result.getResponseHeader())); + return result; + } + } + public static final class GetObjectResponseParser extends AbstractResponseParser { @Override diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/GetObjectMetaRequest.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/GetObjectMetaRequest.java new file mode 100644 index 00000000..ac118378 --- /dev/null +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/GetObjectMetaRequest.java @@ -0,0 +1,29 @@ +package com.alibaba.sdk.android.oss.model; + +public class GetObjectMetaRequest extends OSSRequest { + + private String bucketName; + + private String objectKey; + + public GetObjectMetaRequest(String bucketName, String objectKey) { + setBucketName(bucketName); + setObjectKey(objectKey); + } + + public String getBucketName() { + return bucketName; + } + + public void setBucketName(String bucketName) { + this.bucketName = bucketName; + } + + public String getObjectKey() { + return objectKey; + } + + public void setObjectKey(String objectKey) { + this.objectKey = objectKey; + } +} diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/GetObjectMetaResult.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/GetObjectMetaResult.java new file mode 100644 index 00000000..61c634f1 --- /dev/null +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/model/GetObjectMetaResult.java @@ -0,0 +1,14 @@ +package com.alibaba.sdk.android.oss.model; + +public class GetObjectMetaResult extends OSSResult { + // object metadata + private ObjectMetadata metadata = new ObjectMetadata(); + + public ObjectMetadata getMetadata() { + return metadata; + } + + public void setMetadata(ObjectMetadata metadata) { + this.metadata = metadata; + } +} From 22438d0439fc4336a85a5bc7bab81efb061ce255 Mon Sep 17 00:00:00 2001 From: ws Date: Tue, 13 Sep 2022 13:02:28 +0800 Subject: [PATCH 2/2] Fix the problem that the head interface in resumabledownload cannot get content-length --- .../sdk/android/oss/internal/ResumableDownloadTask.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResumableDownloadTask.java b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResumableDownloadTask.java index e1f9c6ab..3ca68958 100644 --- a/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResumableDownloadTask.java +++ b/oss-android-sdk/src/main/java/com/alibaba/sdk/android/oss/internal/ResumableDownloadTask.java @@ -12,6 +12,8 @@ import com.alibaba.sdk.android.oss.common.utils.CRC64; import com.alibaba.sdk.android.oss.common.utils.OSSUtils; import com.alibaba.sdk.android.oss.exception.InconsistentException; +import com.alibaba.sdk.android.oss.model.GetObjectMetaRequest; +import com.alibaba.sdk.android.oss.model.GetObjectMetaResult; import com.alibaba.sdk.android.oss.model.ResumableDownloadResult; import com.alibaba.sdk.android.oss.model.GetObjectRequest; import com.alibaba.sdk.android.oss.model.GetObjectResult; @@ -643,8 +645,8 @@ static class FileStat implements Serializable { public String requestId; public static FileStat getFileStat(InternalRequestOperation operation, String bucketName, String objectKey) throws ClientException, ServiceException { - HeadObjectRequest request = new HeadObjectRequest(bucketName, objectKey); - HeadObjectResult result = operation.headObject(request, null).getResult(); + GetObjectMetaRequest request = new GetObjectMetaRequest(bucketName, objectKey); + GetObjectMetaResult result = operation.getObjectMeta(request, null).getResult(); FileStat fileStat = new FileStat(); fileStat.fileLength = result.getMetadata().getContentLength();