小さなオブジェクトのコピー
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)」を指定しています。ご利用のエンドポイントを指定します。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)」を指定しています。ご利用のエンドポイントを指定します。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 を有効化する手順は、次のとおりです。
- ossClient.initiateMultipartUpload で UploadPartCopy タスクを初期化します。
- ossClient.uploadPartCopy で UploadPartCopy を開始します。最後のパーツ以外は、100 KB 以上である必要があります。
- ossClient.completeMultipartUpload で UploadPartCopy タスクを実行します。
// 例では、エンドポイントに「杭州 (中国東部 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 をご参照ください。