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 管理对象