小さなオブジェクトのコピー

1 GB に満たないオブジェクトは、ossClient.copyObject で、リージョン内でバケット (ソースバケット) から別のバケット (対象バケット) にコピーします。ossClient.copyObject のパラメータ指定方法には、次の 2 通りがあります。

指定方法 説明
CopyObjectResult copyObject(String sourceBucketName, String sourceKey, String destinationBucketName, String destinationKey) コピー元バケット、コピー元オブジェクト、コピー先バケット、コピー先オブジェクトを指定します。コピーが完了すると、コピー先オブジェクトのコンテンツおよびメタ情報は、コピー元オブジェクトのそれと同じになります。これを簡易コピーといいます。
CopyObjectResult copyObject(CopyObjectRequest copyObjectRequest) コピーするオブジェクトのメタデータを定義し、コピー条件を指定します。コピー元バケットとオブジェクトのコピー先の URL が同じ場合は、コピー元のオブジェクトのメタデータがコピー先のメタデータに置き換えられます。

下表は、CopyObjectRequest に指定可能なパラメータの一覧です。

パラメータ 説明 指定方法
sourceBucketName コピー元バケット名 setSourceBucketName(String sourceBucketName)
sourceKey コピー元オブジェクト名 setSourceKey(String sourceKey)
destinationBucketName コピー先バケット名 setDestinationBucketName(String destinationBucketName)
destinationKey コピー先オブジェクト名 setDestinationKey(String destinationKey)
newObjectMetadata コピー先オブジェクトのメタデータ setNewObjectMetadata(ObjectMetadata newObjectMetadata)
matchingETagConstraints オブジェクトコピーの条件。コピー元オブジェクトの ETag が OSS の算出値と同じ場合、コピー元オブジェクトがコピーされます。異なる場合は、エラーが返されます。 setMatchingETagConstraints(List<String> matchingETagConstraints)
nonmatchingEtagConstraints オブジェクトコピーの条件。コピー元オブジェクトの ETag がユーザー側の提示する ETag と異なる場合、コピー元オブジェクトがコピーされます。同じ場合は、エラーが返されます。 setNonmatchingETagConstraints(List<String> nonmatchingEtagConstraints)
unmodifiedSinceConstraint オブジェクトコピーの条件。指定された時刻が、実際にコピーする時刻以降の場合にのみ、コピー元オブジェクトがコピーされます。それ以外の場合は、エラーが返されます。 setUnmodifiedSinceConstraint(Date unmodifiedSinceConstraint)
modifiedSinceConstraint オブジェクトコピーの条件。コピー元オブジェクトが指定時刻以降に変更されている場合にのみ、コピー元オブジェクトはコピーされます。それ以外の場合は、エラーが返されます。 setModifiedSinceConstraint(Date modifiedSinceConstraint)

下表は、CopyObjectRequest に指定可能なパラメータの一覧です。

パラメータ 説明 指定方法
ETag オブジェクトに固有の識別子 String getETag()
Lastmodified オブジェクトの最終更新時刻 Date getLastModified()
注意 オブジェクトコピーには、次の制約があります。
  • ユーザーに、ソースオブジェクトの読み取りおよび書き込み権限があること。
  • リージョン間でデータをコピーすることはできません。たとえば、杭州 (中国東部 1) のバケットに格納されているオブジェクトを青島 (中国北部 1) にコピーすることはできません。
  • オブジェクトサイズの上限は 1 GB です。
  • 簡易コピー

    次のコードを実行して簡易コピーします。

    1. // 例では、エンドポイントに「杭州 (中国東部 1)」を指定しています。ご利用のエンドポイントを指定します。String endpoint = “http://oss-cn-hangzhou.aliyuncs.com“;// Alibaba Cloud アカウントは OSS の API すべてにアクセスする権限があるため、AccessKey を使用してのログインは非常にリスクを伴います。定期的な運用保守には、RAM ユーザーでのログインを推奨します。RAM アカウントを作成するには、https://ram.console.aliyun.com にログインします。String accessKeyId = “<yourAccessKeyId>”;String accessKeySecret = “<yourAccessKeySecret>”;String sourceBucketName = “<yourSourceBucketName>”;String sourceObjectName = “<yourSourceObjectName>”;String destinationBucketName = “<yourDestinationBucketName>”;String destinationObjectName = “<yourDestinationObjectName>”;// OSSClient インスタンスを作成します。OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// オブジェクトをコピーします。CopyObjectResult result = ossClient.copyObject(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);System.out.println(“ETag: “ + result.getETag() + “ LastModified: “ + result.getLastModified());// OSSClient を閉じます。ossClient.shutdown();
  • CopyObjectRequest でコピー

    CopyObjectRequest でコピーするには、次のコードを実行します。

    1. // 例では、エンドポイントに「杭州 (中国東部 1)」を指定しています。ご利用のエンドポイントを指定します。String endpoint = “http://oss-cn-hangzhou.aliyuncs.com“;// Alibaba Cloud アカウントは OSS の API すべてにアクセスする権限があるため、AccessKey を使用してのログインは非常にリスクを伴います。定期的な運用保守には、RAM ユーザーでのログインを推奨します。RAM アカウントを作成するには、https://ram.console.aliyun.com にログインします。String accessKeyId = “<yourAccessKeyId>”;String accessKeySecret = “<yourAccessKeySecret>”;String sourceBucketName = “<yourSourceBucketName>”;String sourceObjectName = “<yourSourceObjectName>”;String destinationBucketName = “<yourDestinationBucketName>”;String destinationObjectName = “<yourDestinationObjectName>”;// OSSClient インスタンスを作成します。OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// CopyObjectRequest オブジェクトを作成します。CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName);// 新規オブジェクトのメタデータを指定します。ObjectMetadata meta = new ObjectMetadata();meta.setContentType(“text/html”);copyObjectRequest.setNewObjectMetadata(meta);// オブジェクトをコピーします。CopyObjectResult result = ossClient.copyObject(copyObjectRequest);System.out.println(“ETag: “ + result.getETag() + “ LastModified: “ + result.getLastModified());// OSSClient を閉じます。ossClient.shutdown();

大きなオブジェクトのコピー

1 GB 以上のオブジェクトをコピーするには、UploadPartCopy を使用します。オブジェクトを複数のパーツに分割し、それぞれコピーしていきます。UploadPartCopy を有効化する手順は、次のとおりです。

  1. ossClient.initiateMultipartUpload で UploadPartCopy タスクを初期化します。
  2. ossClient.uploadPartCopy で UploadPartCopy を開始します。最後のパーツ以外は、100 KB 以上である必要があります。
  3. ossClient.completeMultipartUpload で UploadPartCopy タスクを実行します。
  1. // 例では、エンドポイントに「杭州 (中国東部 1)」を指定しています。ご利用のエンドポイントを指定します。String endpoint = “http://oss-cn-hangzhou.aliyuncs.com“;// Alibaba Cloud アカウントは OSS の API すべてにアクセスする権限があるため、AccessKey を使用してのログインは非常にリスクを伴います。定期的な運用保守には、RAM ユーザーでのログインを推奨します。RAM アカウントを作成するには、https://ram.console.aliyun.com にログインします。String accessKeyId = “<yourAccessKeyId>”;String accessKeySecret = “<yourAccessKeySecret>”;String sourceBucketName = “<yourSourceBucketName>”;String sourceObjectName = “<yourSourceObjectName>”;String destinationBucketName = “<yourDestinationBucketName>”;String destinationObjectName = “<yourDestinationObjectName>”;ObjectMetadata objectMetadata = ossClient.getObjectMetadata(sourceBucketName, sourceObjectName);// コピーするオブジェクトのサイズを取得します。long contentLength = objectMetadata.getContentLength();// 各パーツを最低 10 MB 以上に指定します。long partSize = 1024 1024 10;// パーツの合計を算出します。int partCount = (int) (contentLength / partSize);if (contentLength % partSize ! = 0) { partCount++;}System.out.println(“total part count:” + partCount);// UploadPartCopy タスクを開始します。InitiateMultipartUploadRequest でオブジェクトのメタデータを設定します。InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(destinationBucketName, destinationObjectName);InitiateMultipartUploadResult initiateMultipartUploadResult = ossClient.initiateMultipartUpload(initiateMultipartUploadRequest);String uploadId = initiateMultipartUploadResult.getUploadId();// UploadPartCopy タスクを開始します。List<PartETag> partETags = new ArrayList<PartETag>();for (int i = 0; i < partCount; i++) { // 各パーツのサイズを算出します。 long skipBytes = partSize * i; long size = partSize < contentLength - skipBytes ? partSize : contentLength - skipBytes; // UploadPartCopyRequest を作成します。UploadPartCopyRequest で条件を指定します。 UploadPartCopyRequest uploadPartCopyRequest = new UploadPartCopyRequest(sourceBucketName, sourceObjectName, destinationBucketName, destinationObjectName); uploadPartCopyRequest.setUploadId(uploadId); uploadPartCopyRequest.setPartSize(size); uploadPartCopyRequest.setBeginIndex(skipBytes); uploadPartCopyRequest.setPartNumber(i + 1); UploadPartCopyResult uploadPartCopyResult = ossClient.uploadPartCopy(uploadPartCopyRequest); // 返されたパーツの ETag を partETags に格納します。 partETags.add(uploadPartCopyResult.getPartETag());}// UploadPartCopy タスクを実行します。CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest( destinationBucketName, destinationObjectName, uploadId, partETags);ossClient.completeMultipartUpload(completeMultipartUploadRequest);// OSSClient を閉じます。ossClient.shutdown();

UploadPartCopy の詳細については、「UploadPartCopy」をご参照ください。UploadPartCopy の完全コードについては、GitHub をご参照ください。