• 沒有找到結果。

DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest("bucketname");

for(VersionOrDeleteMarker v : result.getVersions()) {

deleteRequest.addKeyAndVersion(v.getKey(), v.getVersionId());

}

DeleteObjectsResult deleteResult = obsClient.deleteObjects(deleteRequest);

// 获取删除成功的对象

System.out.println(deleteResult.getDeletedObjectResults());

// 获取删除失败的对象

System.out.println(deleteResult.getErrorResults());

request.setKeyMarker(result.getNextKeyMarker());

request.setVersionIdMarker(result.getNextVersionIdMarker());

}while(result.isTruncated());

● 待复制的源对象的大小不能超过5GB。小于1GB时,建议使用简单复制;大于1GB 时,建议使用分段复制。

● 如果待复制的源对象是归档存储类型,则必须先取回源对象才能进行复制。

简单复制

以下代码展示了如何进行简单复制:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

Java SDK 开发指南 11 管理对象

try{ CopyObjectResult result = obsClient.copyObject("sourcebucketname", "sourceobjectname",

"destbucketname", "destobjectname");

System.out.println("\t" + result.getStatusCode());

System.out.println("\t" + result.getEtag());

}catch (ObsException e) { // 复制失败

System.out.println("HTTP Code: " + e.getResponseCode());

System.out.println("Error Code:" + e.getErrorCode());

System.out.println("Error Message: " + e.getErrorMessage());

System.out.println("Request ID:" + e.getErrorRequestId());

System.out.println("Host ID:" + e.getErrorHostId());

}

重写对象属性

以下代码展示了如何在复制对象时重写对象属性:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

CopyObjectRequest request = new CopyObjectRequest("sourcebucketname", "sourceobjectname",

"destbucketname", "destobjectname");

// 设置进行对象属性重写

request.setReplaceMetadata(true);

ObjectMetadata newObjectMetadata = new ObjectMetadata();

newObjectMetadata.setContentType("image/jpeg");

newObjectMetadata.addUserMetadata("property", "property-value");

newObjectMetadata.setObjectStorageClass(StorageClassEnum.WARM);

request.setNewObjectMetadata(newObjectMetadata);

CopyObjectResult result = obsClient.copyObject(request);

System.out.println("\t" + result.getEtag());

说明

参数 作用 OBS Java SDK对应方法

Copy-Source-If-Unmodified-Since 如果源对象的修改时间早 于该参数值指定的时间,

则进行复制,否则抛出异 常。

CopyObjectRequest.setIf UnmodifiedSince

Copy-Source-If-Match 如果源对象的ETag值与该 参数值相同,则进行复 制,否则抛出异常。

CopyObjectRequest.setIf MatchTag

Copy-Source-If-None-Match 如果源对象的ETag值与该

参数值不相同,则进行复 制,否则抛出异常。

CopyObjectRequest.setIf NoneMatchTag

说明

● 源对象的ETag值是指源对象数据的MD5校验值。

● 如果包含Copy-Source-If-Unmodified-Since并且不符合,或者包含Copy-Source-If-Match并 且不符合,或者包含Copy-Source-If-Modified-Since并且不符合,或者包含Copy-Source-If-None-Match并且不符合,则复制失败,抛出异常中HTTP状态码为:412 precondition failed。

Copy-Source-If-Modified-Since和Copy-Source-If-None-Match可以一起使用;Copy-Source-If-Unmodified-Since和Copy-Source-If-Match可以一起使用。

以下代码展示了如何进行限定条件复制:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

CopyObjectRequest request = new CopyObjectRequest("sourcebucketname", "sourceobjectname",

"destbucketname", "destobjectname");

request.setIfModifiedSince(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01"));

request.setIfNoneMatchTag("none-match-etag");

CopyObjectResult result = obsClient.copyObject(request);

System.out.println("\t" + result.getEtag());

重写对象访问权限

以下代码展示了如何在复制对象时重写对象访问权限:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

// 创建ObsClient实例

ObsClient obsClient = new ObsClient(ak, sk, endPoint);

CopyObjectRequest request = new CopyObjectRequest("sourcebucketname", "sourceobjectname",

"destbucketname", "destobjectname");

// 复制时重写对象访问权限为公共读

request.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);

Java SDK 开发指南 11 管理对象

CopyObjectResult result = obsClient.copyObject(request);

System.out.println("\t" + result.getEtag());

分段复制

分段复制是分段上传的一种特殊情况,即分段上传任务中的段通过复制OBS指定桶中 现有对象(或对象的一部分)来实现。您可以通过ObsClient.copyPart来复制段。以下 代码展示了如何使用分段复制模式复制大对象:

String endPoint = "https://your-endpoint";

String ak = "*** Provide your Access Key ***";

String sk = "*** Provide your Secret Key ***";

final String destBucketName = "destbucketname";

final String destObjectKey = "destobjectname";

final String sourceBucketName = "sourcebucketname";

final String sourceObjectKey = "sourceobjectname";

// 创建ObsClient实例

final ObsClient obsClient = new ObsClient(ak, sk, endPoint);

// 初始化线程池

ExecutorService executorService = Executors.newFixedThreadPool(20);

// 初始化分段上传任务

InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(destBucketName, destObjectKey);

InitiateMultipartUploadResult result = obsClient.initiateMultipartUpload(request);

final String uploadId = result.getUploadId();

System.out.println("\t"+ uploadId + "\n");

// 获取大对象信息

ObjectMetadata metadata = obsClient.getObjectMetadata(sourceBucketName, sourceObjectKey);

// 每段复制100MB

long partSize = 100 * 1024 * 1024L;

long objectSize = metadata.getContentLength();

// 计算需要复制的段数

long partCount = objectSize % partSize == 0 ? objectSize / partSize : objectSize / partSize + 1;

final List<PartEtag> partEtags = Collections.synchronizedList(new ArrayList<PartEtag>());

// 执行并发复制段

executorService.execute(new Runnable() {

request.setSourceBucketName(sourceBucketName);

request.setSourceObjectKey(sourceObjectKey);

request.setDestinationBucketName(destBucketName);

request.setDestinationObjectKey(destObjectKey);

request.setByteRangeStart(rangeStart);

{

result = obsClient.copyPart(request);

System.out.println("Part#" + partNumber + " done\n");

partEtags.add(new PartEtag(result.getEtag(), result.getPartNumber()));

}

catch (ObsException e) {

e.printStackTrace();

} } });

}

// 等待复制完成

executorService.shutdown();

while (!executorService.isTerminated()) { try

{

executorService.awaitTermination(5, TimeUnit.SECONDS);

}

catch (InterruptedException e) {

e.printStackTrace();

} } // 合并段

CompleteMultipartUploadRequest completeMultipartUploadRequest = new

CompleteMultipartUploadRequest(destBucketName, destObjectKey, uploadId, partEtags);

obsClient.completeMultipartUpload(completeMultipartUploadRequest);

Java SDK 开发指南 11 管理对象

12 临时授权访问