オブジェクトのコンテンツを変更せずに、同じリージョン内のソースバケットからデスティネーションバケットにオブジェクトをコピーできます。 この操作は、データのバックアップと移行によく使用されます。
制限
異なるリージョンにあるバケット間でオブジェクトをコピーすることはできません。 たとえば、中国 (杭州) リージョンのバケットから中国 (上海) リージョンのバケットにオブジェクトをコピーすることはできません。
使用上の注意
多数のオブジェクトをコピーしてすぐにストレージタイプをディープコールドアーカイブに設定すると、PUT リクエスト料金が高額になる場合があります。 コストを削減するには、ライフサイクルルール を構成して、コピー後にこれらのオブジェクトをディープコールドアーカイブオブジェクトに移行します。
ソースオブジェクトに対する読み取り権限と、デスティネーションバケットに対する読み取りおよび書き込み権限が必要です。 そうしないと、コピー操作は失敗します。
ソースバケットとデスティネーションバケットに保持ポリシーが構成されていないことを確認してください。 そうしないと、次のエラーメッセージが返されます: 指定したオブジェクトは変更不可です。
デフォルトでは、デスティネーションバケット内の既存のオブジェクトと同じ名前のオブジェクトをコピーすると、コピーされたオブジェクトはデスティネーションバケット内の既存のオブジェクトを上書きします。 次の方法のいずれかを使用して、オブジェクトが予期せず上書きされないように保護できます。
デスティネーションバケットのバージョン管理を有効にする
デスティネーションバケットでバージョン管理が有効になっている場合、デスティネーションバケットで削除および上書きされたオブジェクトは以前のバージョンとして保存されます。 以前のバージョンはいつでも復元できます。 詳細については、「バージョン管理」をご参照ください。
コピーリクエストに x-oss-forbid-overwrite ヘッダーを含める
x-oss-forbid-overwrite ヘッダーをコピーリクエストに含め、ヘッダーを true に設定して、オブジェクトの上書きを無効にすることができます。 デスティネーションバケット内の既存のオブジェクトと同じ名前のオブジェクトをコピーすると、オブジェクトのコピーに失敗し、
FileAlreadyExistsエラーコードが返されます。
メソッド
ossbrowser の使用
ossbrowser を使用してオブジェクトをコピーする場合、オブジェクトのサイズは 5 GB 未満である必要があります。 ossbrowser を使用してオブジェクトをコピーする方法の詳細については、「よくある操作」をご参照ください。
OSS SDK の使用
次のコードは、一般的なプログラミング言語の OSS SDK を使用して、CopyObject 操作を呼び出して 1 GB 未満のオブジェクトをコピーする方法の例を示しています。 他のプログラミング言語の OSS SDK を使用して 1 GB 未満のオブジェクトをコピーする方法、および UploadPartCopy 操作を呼び出して 1 GB を超えるオブジェクトをコピーする方法の詳細については、「概要」をご参照ください。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
public class Demo {
public static void main(String[] args) throws Exception {
// この例では、中国 (杭州) リージョンのエンドポイントが使用されています。 実際のエンドポイントを指定してください。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// ソースバケットの名前を指定します。
String sourceBucketName = "srcexamplebucket";
// ソースオブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。
String sourceKey = "srcexampleobject.txt";
// デスティネーションバケットの名前を指定します。 デスティネーションバケットは、ソースバケットと同じリージョンにある必要があります。
String destinationBucketName = "desexamplebucket";
// デスティネーションオブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。
String destinationKey = "desexampleobject.txt";
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// OSSClient インスタンスを作成します。
// OSSClient が不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// CopyObjectRequest オブジェクトを作成します。
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(sourceBucketName, sourceKey, destinationBucketName, destinationKey);
// オブジェクトの新しいメタデータを構成します。
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType("text/plain");
// CopyObject 操作で同じ名前のオブジェクトを上書きするかどうかを指定します。 この例では、このパラメーターは true に設定されており、操作で同じ名前のオブジェクトを上書きしないことを指定しています。
// meta.setHeader("x-oss-forbid-overwrite", "true");
// ソースオブジェクトのパスを指定します。
// meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE, "/examplebucket/recode-test.txt");
// ソースオブジェクトの ETag 値がリクエストで指定された ETag 値と同じである場合、OSS はオブジェクトをコピーし、200 OK を返します。
// meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE_IF_MATCH, "5B3C1A2E053D763E1B002CC607C5****");
// ソースオブジェクトの ETag 値がリクエストで指定された ETag 値と異なる場合、OSS はオブジェクトをコピーし、200 OK を返します。
// meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE_IF_NONE_MATCH, "5B3C1A2E053D763E1B002CC607C5****");
// リクエストで指定された時刻がオブジェクトの変更時刻と同じかそれ以降の場合、OSS はオブジェクトをコピーし、200 OK を返します。
// meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE_IF_UNMODIFIED_SINCE, "2021-12-09T07:01:56.000Z");
// リクエストで指定された時刻の後にソースオブジェクトが変更された場合、OSS はオブジェクトをコピーします。
// meta.setHeader(OSSHeaders.COPY_OBJECT_SOURCE_IF_MODIFIED_SINCE, "2021-12-09T07:01:56.000Z");
// デスティネーションオブジェクトのメタデータを構成するために使用されるメソッドを指定します。 この例では、メソッドは COPY に設定されており、ソースオブジェクトのメタデータがデスティネーションオブジェクトにコピーされることを指定しています。
// meta.setHeader(OSSHeaders.COPY_OBJECT_METADATA_DIRECTIVE, "COPY");
// オブジェクトの作成時にデスティネーションオブジェクトの暗号化に使用されるサーバー側暗号化アルゴリズムを指定します。
// meta.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION, ObjectMetadata.KMS_SERVER_SIDE_ENCRYPTION);
// Key Management Service (KMS) によって管理されるカスタマーマスターキー (CMK) を指定します。 このパラメーターは、x-oss-server-side-encryption を KMS に設定した場合にのみ有効になります。
// meta.setHeader(OSSHeaders.OSS_SERVER_SIDE_ENCRYPTION_KEY_ID, "9468da86-3509-4f8d-a61e-6eab1eac****");
// デスティネーションオブジェクトのアクセス制御リスト (ACL) を指定します。 この例では、ACL は private に設定されており、オブジェクトの所有者と承認されたユーザーのみがオブジェクトに対する読み取りおよび書き込み権限を持つことを指定しています。
// meta.setHeader(OSSHeaders.OSS_OBJECT_ACL, CannedAccessControlList.Private);
// デスティネーションオブジェクトのストレージタイプを指定します。 この例では、ストレージタイプは Standard に設定されています。
// meta.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard);
// デスティネーションオブジェクトのタグを指定します。 オブジェクトに複数のタグを一度に指定できます。
// meta.setHeader(OSSHeaders.OSS_TAGGING, "a:1");
// デスティネーションオブジェクトのタグを構成するために使用されるメソッドを指定します。 この例では、メソッドは COPY に設定されており、ソースオブジェクトのタグがデスティネーションオブジェクトにコピーされることを指定しています。
// meta.setHeader(OSSHeaders.COPY_OBJECT_TAGGING_DIRECTIVE, "COPY");
copyObjectRequest.setNewObjectMetadata(meta);
// ソースオブジェクトをコピーします。
CopyObjectResult result = ossClient.copyObject(copyObjectRequest);
System.out.println("ETag: " + result.getETag() + " LastModified: " + result.getLastModified());
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
} const OSS = require('ali-oss');
const client = new OSS({
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを oss-cn-hangzhou に設定します。
region: 'yourRegion',
// 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// バケットの名前を指定します。 例: examplebucket。
bucket: 'examplebucket',
// HTTPS を有効にするかどうかを指定します。 secure を true に設定すると、HTTPS が有効になります。
// secure: true
})
// バケット内のオブジェクトをコピーします。
async function copySmallObjecInSameBucket() {
try {
// ソースオブジェクトとデスティネーションオブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。
// デスティネーションオブジェクトの HTTP ヘッダーとメタデータを指定します。
const result = await client.copy('destexampleobject.txt', 'srcexampleobject.txt', {
// headers パラメーターを構成して、デスティネーションオブジェクトの HTTP ヘッダーを指定します。 headers パラメーターを構成しない場合、デスティネーションオブジェクトの HTTP ヘッダーはソースオブジェクトの HTTP ヘッダーと同じになります。 ソースオブジェクトの HTTP ヘッダーがコピーされます。
headers: {
'Cache-Control': 'no-cache',
// ソースオブジェクトの ETag 値がリクエストで指定された ETag 値と同じである場合、OSS はオブジェクトをコピーし、200 OK を返します。
'if-match': '5B3C1A2E053D763E1B002CC607C5****',
// リクエストで指定した ETag 値がソースオブジェクトの ETag 値と異なる場合、OSS はオブジェクトをコピーし、200 OK を返します。
'if-none-match': '5B3C1A2E053D763E1B002CC607C5****',
// リクエストで指定された時刻がオブジェクトの変更時刻よりも前の場合、OSS はオブジェクトをコピーし、200 OK を返します。
'if-modified-since': '2021-12-09T07:01:56.000Z',
// リクエストで指定された時刻がオブジェクトの変更時刻よりも後の場合、OSS はオブジェクトをコピーし、200 OK を返します。
'if-unmodified-since': '2021-12-09T07:01:56.000Z',
// デスティネーションオブジェクトのアクセス制御リスト (ACL) を指定します。 この例では、ACL は private に設定されており、オブジェクトの所有者と承認されたユーザーのみがオブジェクトに対する読み取りおよび書き込み権限を持つことを示しています。
'x-oss-object-acl': 'private',
// オブジェクトのタグを指定します。 オブジェクトに複数のタグを同時に指定できます。
'x-oss-tagging': 'Tag1=1&Tag2=2',
// CopyObject 操作で同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 この例では、このパラメーターは true に設定されており、CopyObject 操作で同じ名前の既存のオブジェクトを上書きしないことを指定しています。
'x-oss-forbid-overwrite': 'true',
},
// meta パラメーターを構成して、デスティネーションオブジェクトのメタデータを指定します。 meta パラメーターを構成しない場合、デスティネーションオブジェクトのメタデータはソースオブジェクトのメタデータと同じになります。 ソースオブジェクトのメタデータがコピーされます。
meta: {
location: 'hangzhou',
year: 2015,
people: 'mary',
},
});
console.log(result);
} catch (e) {
console.log(e);
}
}
copySmallObjecInSameBucket()using Aliyun.OSS;
using Aliyun.OSS.Common;
// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// ソースバケットの名前を指定します。 例: srcexamplebucket。
var sourceBucket = "srcexamplebucket";
// ソースオブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。 例: srcdir/scrobject.txt。
var sourceObject = "srcdir/scrobject.txt";
// デスティネーションバケットの名前を指定します。 デスティネーションバケットは、ソースバケットと同じリージョンにある必要があります。 例: destbucket。
var targetBucket = "destbucket";
// デスティネーションオブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。 例: destdir/destobject.txt。
var targetObject = "destdir/destobject.txt";
// バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、要件に基づいてデフォルトパラメーターを変更します。
var conf = new ClientConfiguration();
// 署名アルゴリズム V4 を使用します。
conf.SignatureVersion = SignatureVersion.V4;
// OSSClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
var metadata = new ObjectMetadata();
// ユーザーメタデータを指定します。 ユーザーメタデータはキーと値のペアとして保存されます。 たとえば、キーは mk1、値は mv1 です。
metadata.AddHeader("mk1", "mv1");
metadata.AddHeader("mk2", "mv2");
var req = new CopyObjectRequest(sourceBucket, sourceObject, targetBucket, targetObject)
{
// NewObjectMetadata の値が null の場合、COPY モードが使用され、ソースオブジェクトのメタデータがデスティネーションオブジェクトにコピーされます。 NewObjectMetadata の値が null でない場合、REPLACE モードが使用され、デスティネーションオブジェクトのメタデータはリクエストで指定されたメタデータによって上書きされます。
NewObjectMetadata = metadata
};
// オブジェクトをコピーします。
client.CopyObject(req);
Console.WriteLine("Copy object succeeded");
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID: {2} \tHostID: {3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}// ソースバケットの名前を指定します。
String srcBucketName = "srcbucket";
// ソースオブジェクトの完全なパスを指定します。
String srcObjectKey = "dir1/srcobject.txt";
// デスティネーションバケットの名前を指定します。 デスティネーションバケットは、ソースバケットと同じリージョンにある必要があります。
String destBucketName = "destbucket";
// デスティネーションオブジェクトの完全なパスを指定します。
String destObjectKey = "dir2/destobject.txt";
// オブジェクトをコピーするリクエストを作成します。
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcObjectKey, destBucketName, destObjectKey);
// ObjectMetadata objectMetadata = new ObjectMetadata();
// オブジェクトのアクセス制御リスト (ACL) を指定します。 この例では、ACL は private に設定されています。
// objectMetadata.setHeader("x-oss-object-acl", "private");
// オブジェクトのストレージタイプを指定します。 この例では、ストレージタイプは Standard に設定されています。
// objectMetadata.setHeader("x-oss-storage-class", "Standard");
// CopyObject 操作で同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 この例では、このパラメーターは true に設定されており、CopyObject 操作で同じ名前の既存のオブジェクトを上書きしないことを指定しています。
// objectMetadata.setHeader("x-oss-forbid-overwrite", "true");
// ソースオブジェクトの ETag 値がリクエストで指定された ETag 値と同じである場合、OSS はオブジェクトをコピーします。
// objectMetadata.setHeader("x-oss-copy-source-if-match", "5B3C1A2E053D763E1B002CC607C5****");
// ソースオブジェクトのパスを指定します。
// objectMetadata.setHeader("x-oss-copy-source", "/examplebucket/recode-test.txt");
// ソースオブジェクトの ETag 値がリクエストで指定された ETag 値と異なる場合、OSS はオブジェクトをコピーします。
// objectMetadata.setHeader("x-oss-copy-source-if-none-match", "5B3C1A2E053D763E1B002CC607C5****");
// リクエストで指定された時刻がオブジェクトの変更時刻と同じかそれ以降の場合、OSS はオブジェクトをコピーします。
// objectMetadata.setHeader("x-oss-copy-source-if-unmodified-since", "2021-12-09T07:01:56.000Z");
// リクエストで指定された時刻の後にソースオブジェクトが変更された場合、OSS はオブジェクトをコピーします。
// objectMetadata.setHeader("x-oss-copy-source-if-modified-since", "2021-12-09T07:01:56.000Z");
// デスティネーションオブジェクトのメタデータを構成するために使用されるメソッドを指定します。 この例では、メソッドは COPY に設定されており、ソースオブジェクトのメタデータがデスティネーションオブジェクトにコピーされることを指定しています。
// objectMetadata.setHeader("x-oss-metadata-directive", "COPY");
// オブジェクトの作成時にデスティネーションオブジェクトの暗号化に使用されるサーバー側暗号化アルゴリズムを指定します。
// objectMetadata.setHeader("x-oss-server-side-encryption", "SSE-KMS");
// Key Management Service (KMS) によって管理されるカスタマーマスターキー (CMK) を指定します。 このパラメーターは、x-oss-server-side-encryption を KMS に設定した場合にのみ有効になります。
// objectMetadata.setHeader("x-oss-server-side-encryption-key-id", "9468da86-3509-4f8d-a61e-6eab1eac****");
// オブジェクトのタグを指定します。 複数のタグを一度に指定できます。
// objectMetadata.setHeader("x-oss-tagging", "a:1");
// デスティネーションオブジェクトのタグを構成するために使用されるメソッドを指定します。 この例では、メソッドは COPY に設定されており、ソースオブジェクトのタグがデスティネーションオブジェクトにコピーされることを指定しています。
// objectMetadata.setHeader("x-oss-tagging-directive", "COPY");
// 非同期モードでオブジェクトをコピーします。
OSSAsyncTask copyTask = oss.asyncCopyObject(copyObjectRequest, new OSSCompletedCallback<CopyObjectRequest, CopyObjectResult>() {
@Override
public void onSuccess(CopyObjectRequest request, CopyObjectResult result) {
Log.d("copyObject", "copy success!");
}
@Override
public void onFailure(CopyObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
// リクエストの例外を処理します。
if (clientExcepion != null) {
// クライアント側の例外 (ネットワーク例外など) を処理します。
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// サーバー側の例外を処理します。
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});OSSCopyObjectRequest * copy = [OSSCopyObjectRequest new];
// ソースバケットの名前を指定します。
copy.sourceBucketName = @"sourcebucket";
// ソースオブジェクトの完全なパスを指定します。
copy.sourceObjectKey = @"dir1/srcobject.txt";
// デスティネーションバケットの名前を指定します。
copy.bucketName = @"destbucket";
// デスティネーションオブジェクトの完全なパスを指定します。
copy.objectKey = @"dir2/destobject.txt";
NSMutableDictionary *objectMeta = [NSMutableDictionary dictionary];
// デスティネーションオブジェクトのアクセス制御リスト (ACL) を指定します。 この例では、デスティネーションオブジェクトの ACL は private に設定されています。
[objectMeta setValue:@"x-oss-object-acl" forKey:@"public-read"];
// デスティネーションオブジェクトのストレージタイプを指定します。 この例では、デスティネーションオブジェクトのストレージタイプは Standard に設定されています。
[objectMeta setValue:@"x-oss-storage-class" forKey:@"Standard"];
// 同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 x-oss-forbid-overwrite が指定されていない場合、同じ名前の既存のオブジェクトは上書きされます。
// x-oss-forbid-overwrite が false に設定されている場合、同じ名前の既存のオブジェクトは上書きされます。 x-oss-forbid-overwrite が true に設定されている場合、同じ名前の既存のオブジェクトは上書きされません。 既存のオブジェクトが同じ名前の場合、エラーが報告されます。
[objectMeta setValue:@"x-oss-forbid-overwrite" forKey:@"true"];
// ソースオブジェクトの ETag 値がリクエストで指定した ETag 値と同じである場合、オブジェクトはコピーされます。
[objectMeta setValue:@"x-oss-copy-source-if-match" forKey:@"5B3C1A2E053D763E1B002CC607C5****"];
// ソースオブジェクトの ETag 値がリクエストで指定した ETag 値と異なる場合、オブジェクトはコピーされます。
[objectMeta setValue:@"x-oss-copy-source-if-none-match" forKey:@"5B3C1A2E053D763E1B002CC607C5****"];
// オブジェクトが 2021 年 12 月 9 日 07:01:56.000 以前 (UTC) に変更された場合、オブジェクトはコピーされます。
[objectMeta setValue:@"x-oss-copy-source-if-unmodified-since" forKey:@"2021-12-09T07:01:56.000Z"];
// オブジェクトが 2021 年 12 月 15 日 07:01:56.000 以後 (UTC) に変更された場合、オブジェクトはコピーされます。
[objectMeta setValue:@"x-oss-copy-source-if-modified-since" forKey:@"2021-12-15T07:01:56.000Z"];
// ソースオブジェクトのメタデータをデスティネーションオブジェクトにコピーします。
[objectMeta setValue:@"x-oss-metadata-directive" forKey:@"COPY"];
// ソースオブジェクトのタグをデスティネーションオブジェクトにコピーします。
[objectMeta setValue:@"x-oss-tagging-directive" forKey:@"Copy"];
// OSS がオブジェクトを作成するときにデスティネーションオブジェクトの暗号化に使用されるサーバー側暗号化アルゴリズムを指定します。
[objectMeta setValue:@"x-oss-server-side-encryption" forKey:@"KMS"];
// Key Management Service (KMS) によって管理されるカスタマーマスターキー (CMK) を指定します。 このパラメーターは、x-oss-server-side-encryption が KMS に設定されている場合にのみ有効になります。
[objectMeta setValue:@"x-oss-server-side-encryption-key-id" forKey:@"9468da86-3509-4f8d-a61e-6eab1eac****"];
copy.objectMeta = objectMeta;
OSSTask * task = [client copyObject:copy];
[task continueWithBlock:^id(OSSTask *task) {
if (!task.error) {
NSLog(@"copy object success!");
} else {
NSLog(@"copy object failed, error: %@" , task.error);
}
return nil;
}];
// タスクが完了するまで同期ブロッキングを実装します。
// [task waitUntilFinished];#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS へのアクセスに使用されるアカウントに関する情報を初期化します。 */
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 */
std::string Region = "yourRegion";
/* ソースバケットの名前を指定します。 例: srcexamplebucket。 */
std::string SourceBucketName = "srcexamplebucket";
/* デスティネーションバケットの名前を指定します。 デスティネーションバケットは、ソースバケットと同じリージョンにある必要があります。 例: destbucket。 */
std::string CopyBucketName = "destbucket";
/* ソースオブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。 例: srcdir/scrobject.txt。 */
std::string SourceObjectName = "srcdir/scrobject.txt";
/* デスティネーションオブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。 例: destdir/destobject.txt。 */
std::string CopyObjectName = "destdir/destobject.txt";
/* ネットワークリソースなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
CopyObjectRequest request(CopyBucketName, CopyObjectName);
request.setCopySource(SourceBucketName, SourceObjectName);
/* オブジェクトをコピーします。 */
auto outcome = client.CopyObject(request);
if (!outcome.isSuccess()) {
/* 例外を処理します。 */
std::cout << "CopyObject fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* ネットワークリソースなどのリソースを解放します。 */
ShutdownSdk();
return 0;
}#include "oss_api.h"
#include "aos_http_io.h"
/* バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
const char *endpoint = "yourEndpoint";
/* ソースバケットの名前を指定します。 */
const char *source_bucket_name = "yourSourceBucketName";
/* ソースオブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。 */
const char *source_object_name = "yourSourceObjectName";
/* デスティネーションバケットの名前を指定します。 デスティネーションバケットは、ソースバケットと同じリージョンにある必要があります。 */
const char *dest_bucket_name = "yourDestBucketName";
/* デスティネーションオブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。 */
const char *dest_object_name = "yourDestObjectName";
/* バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。 */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* char* 文字列を使用して aos_string_t タイプのデータを初期化します。 */
aos_str_set(&options->config->endpoint, endpoint);
/* 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。 */
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
// 2 つの追加パラメーターを指定します。
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* CNAME を使用するかどうかを指定します。 値 0 は、CNAME が使用されていないことを示します。 */
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを指定します。 */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* main() で aos_http_io_initialize メソッドを呼び出して、ネットワークリソースやメモリリソースなどのグローバルリソースを初期化します。 */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリを管理するためのメモリプールを作成します。 aos_pool_t は apr_pool_t と同等です。 メモリプールを作成するために使用されるコードは APR ライブラリに含まれています。 */
aos_pool_t *pool;
/* メモリプールを作成します。 2 番目のパラメーターの値は NULL です。 この値は、プールが他のメモリプールを継承しないことを示します。 */
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。 このパラメーターには、endpoint、access_key_id、access_key_secret、is_cname、curl などのグローバル構成情報が含まれています。 */
oss_request_options_t *oss_client_options;
/* メモリプールのメモリリソースをオプションに割り当てます。 */
oss_client_options = oss_request_options_create(pool);
/* oss_client_options を初期化します。 */
init_options(oss_client_options);
/* パラメーターを初期化します。 */
aos_string_t source_bucket;
aos_string_t source_object;
aos_string_t dest_bucket;
aos_string_t dest_object;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
aos_str_set(&source_bucket, source_bucket_name);
aos_str_set(&source_object, source_object_name);
aos_str_set(&dest_bucket, dest_bucket_name);
aos_str_set(&dest_object, dest_object_name);
headers = aos_table_make(pool, 0);
/* オブジェクトをコピーします。 */
resp_status = oss_copy_object(oss_client_options, &source_bucket, &source_object, &dest_bucket, &dest_object, headers, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("copy object succeeded\n");
} else {
printf("copy object failed\n");
}
/* メモリプールを解放します。 この操作により、リクエストに割り当てられたメモリリソースが解放されます。 */
aos_pool_destroy(pool);
/* 割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# 環境変数からアクセス認証情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
access_key_id: ENV['OSS_ACCESS_KEY_ID'],
access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)
# バケットの名前を指定します。 例: examplebucket。
bucket = client.get_bucket('examplebucket')
# オブジェクトとオブジェクトメタデータをコピーします。
bucket.copy_object(
# この例では、ソースバケットの srcobject.txt がデスティネーションバケットの destobject.txt にコピーされます。
'destobject.txt', 'srcobject.txt',
:meta_directive => Aliyun::OSS::MetaDirective::COPY)
# オブジェクトをコピーし、元のメタデータを上書きします。
bucket.copy_object(
'destobject.txt', 'srcobject.txt',
:metas => {'year' => '2017'},
:meta_directive => Aliyun::OSS::MetaDirective::REPLACE) package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
// グローバル変数を指定します。
var (
region string // リージョン。
srcBucketName string // ソースバケットの名前。
srcObjectName string // ソースオブジェクトの名前。
destBucketName string // デスティネーションバケットの名前。
destObjectName string // デスティネーションオブジェクトの名前。
)
// コマンドラインパラメーターを初期化するために使用される init 関数を指定します。
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&srcBucketName, "src-bucket", "", "ソースバケットの名前。")
flag.StringVar(&srcObjectName, "src-object", "", "ソースオブジェクトの名前。")
flag.StringVar(&destBucketName, "dest-bucket", "", "デスティネーションバケットの名前。")
flag.StringVar(&destObjectName, "dest-object", "", "デスティネーションオブジェクトの名前。")
}
func main() {
// コマンドラインパラメーターを解析します。
flag.Parse()
// ソースバケット名が空かどうかを確認します。
if len(srcBucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーター、ソースバケット名が必要です")
}
// リージョンが空かどうかを確認します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーター、リージョンが必要です")
}
// デスティネーションバケット名が指定されていない場合は、ソースバケット名が使用されます。
if len(destBucketName) == 0 {
destBucketName = srcBucketName
}
// ソースオブジェクト名が空かどうかを確認します。
if len(srcObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーター、ソースオブジェクト名が必要です")
}
// デスティネーションオブジェクト名が空かどうかを確認します。
if len(destObjectName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーター、デスティネーションオブジェクト名が必要です")
}
// デフォルト構成を読み込み、認証情報プロバイダーとリージョンを指定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// オブジェクトをコピーするリクエストを作成します。
request := &oss.CopyObjectRequest{
Bucket: oss.Ptr(destBucketName), // デスティネーションバケットの名前。
Key: oss.Ptr(destObjectName), // デスティネーションオブジェクトの名前。
SourceKey: oss.Ptr(srcObjectName), // ソースオブジェクトの名前。
SourceBucket: oss.Ptr(srcBucketName), // ソースバケットの名前。
}
// ソースオブジェクトをコピーし、結果を処理します。
result, err := client.CopyObject(context.TODO(), request)
if err != nil {
log.Fatalf("オブジェクトのコピーに失敗しました %v", err)
}
log.Printf("オブジェクトのコピー結果:%#v\n", result)
}
import argparse
import alibabacloud_oss_v2 as oss
# コマンドラインパラメーターパーサーを作成します。
parser = argparse.ArgumentParser(description="copy object sample")
# --region パラメーターを指定して、バケットが配置されているリージョンを示します。 このパラメーターは必須です。
parser.add_argument('--region', help='バケットが配置されているリージョン。', required=True)
# --bucket パラメーターを指定します。これは、デスティネーションバケットの名前を指定します。 このパラメーターは必須です。
parser.add_argument('--bucket', help='デスティネーションバケットの名前。', required=True)
# --endpoint パラメーターを指定して、バケットが配置されているリージョンのエンドポイントを示します。 このパラメーターはオプションです。
parser.add_argument('--endpoint', help='他のサービスが OSS にアクセスするために使用できるドメイン名')
# --key パラメーターを指定します。これは、デスティネーションオブジェクトの名前を指定します。 このパラメーターは必須です。
parser.add_argument('--key', help='デスティネーションオブジェクトの名前。', required=True)
# --source_key パラメーターを指定します。これは、ソースオブジェクトの名前を指定します。 このパラメーターは必須です。
parser.add_argument('--source_key', help='ソースオブジェクトの名前。', required=True)
# --source_bucket パラメーターを指定します。これは、ソースバケットの名前を指定します。 このパラメーターは必須です。
parser.add_argument('--source_bucket', help='ソースバケットの名前。', required=True)
def main():
# コマンドラインパラメーターを解析します。
args = parser.parse_args()
# 認証のために環境変数からアクセス認証情報を取得します。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# SDK のデフォルト構成を読み込み、認証情報プロバイダーを指定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# バケットが配置されているリージョンを指定します。
cfg.region = args.region
# endpoint パラメーターが提供されている場合は、エンドポイントを指定します。
if args.endpoint is not None:
cfg.endpoint = args.endpoint
# 構成を使用して OSSClient インスタンスを作成します。
client = oss.Client(cfg)
# オブジェクトをコピーします。
result = client.copy_object(oss.CopyObjectRequest(
bucket=args.bucket, # デスティネーションバケットの名前。
key=args.key, # デスティネーションオブジェクトのキー名。
source_key=args.source_key, # ソースオブジェクトのキー名。
source_bucket=args.source_bucket, # ソースバケットの名前。
))
# コピー操作の結果情報を出力します。
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' version id: {result.version_id},'
f' hash crc64: {result.hash_crc64},'
f' source version id: {result.source_version_id},'
f' server side encryption: {result.server_side_encryption},'
f' server side data encryption: {result.server_side_data_encryption},'
f' last modified: {result.last_modified},'
f' etag: {result.etag},'
)
# スクリプトが直接実行されたときに main 関数を呼び出します。
if __name__ == "__main__":
main() # スクリプトが直接実行されたときに、スクリプトの main 関数にエントリポイントを指定します。<?php
// 依存関係を読み込むために autoload ファイルを含めます。
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// コマンドラインパラメーターを定義して説明します。
$optsdesc = [
"region" => ['help' => 'バケットが配置されているリージョン。', 'required' => True], // (必須) バケットが配置されているリージョンを指定します。
"endpoint" => ['help' => '他のサービスが OSS にアクセスするために使用できるドメイン名。', 'required' => False], // (オプション) エンドポイントを指定します。
"bucket" => ['help' => 'バケットの名前', 'required' => True], // (必須) デスティネーションバケットの名前を指定します。
"key" => ['help' => 'オブジェクトの名前', 'required' => True], // (必須) デスティネーションオブジェクトの名前を指定します。
"src-bucket" => ['help' => 'ソースバケットの名前', 'required' => False], // (オプション) ソースバケットの名前を指定します。
"src-key" => ['help' => 'ソースオブジェクトの名前', 'required' => True], // (必須) ソースオブジェクトの名前を指定します。
];
// getopt で必要な長いオプションのリストに説明を変換します。
// 各パラメーターの末尾にコロン (:) を追加して、値が必要であることを示します。
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
// コマンドラインパラメーターを解析します。
$options = getopt("", $longopts);
// 必要なパラメーターが構成されているかどうかを確認します。
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help']; // パラメーターのヘルプ情報を取得します。
echo "Error: the following arguments are required: --$key, $help" . PHP_EOL;
exit(1); // 必要なパラメーターがない場合はプログラムを終了します。
}
}
// コマンドラインパラメーターから解析された値を対応する変数に割り当てます。
$region = $options["region"]; // バケットが配置されているリージョン。
$bucket = $options["bucket"]; // デスティネーションバケットの名前。
$key = $options["key"]; // デスティネーションオブジェクトの名前。
$srcKey = $options["src-key"]; // ソースオブジェクトの名前。
// 環境変数からアクセス認証情報をロードします。
// EnvironmentVariableCredentialsProvider を使用して、環境変数から AccessKey ID と AccessKey シークレットを取得します。
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
// SDK のデフォルト構成を使用します。
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider); // 認証情報プロバイダーを指定します。
$cfg->setRegion($region); // バケットが配置されているリージョンを指定します。
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]); // エンドポイントが提供されている場合は、エンドポイントを指定します。
}
// OSSClient インスタンスを作成します。
$client = new Oss\Client($cfg);
// CopyObjectRequest オブジェクトを作成して、ソースオブジェクトをコピーします。
$request = new Oss\Models\CopyObjectRequest(
bucket: $bucket,
key: $key);
if (!empty($options["src-bucket"])) {
$request->sourceBucket = $options["src-bucket"]; // ソースバケット名が提供されている場合は、sourceBucket パラメーターを指定します。
}
$request->sourceKey = $srcKey; // ソースオブジェクトの名前を指定します。
// ソースオブジェクトをコピーします。
$result = $client->copyObject($request);
// 結果を出力します。
printf(
'status code:' . $result->statusCode . PHP_EOL . // HTTP ステータスコード。 たとえば、HTTP ステータスコード 200 は、リクエストが成功したことを示します。
'request id:' . $result->requestId . PHP_EOL // リクエスト ID。リクエストのデバッグまたは追跡に使用されます。
);
ossutil の使用
ossutil を使用してオブジェクトをリストできます。 詳細については、「ossutil のインストール」をご参照ください。
次の例は、srcBucket から examplebucket に srcObject をコピーする方法を示しています。
ossutil api copy-object --bucket examplebucket --key exampleobject --copy-source /srcBucket/srcObject詳細については、「copy-object」をご参照ください。
関連 API 操作
上記の操作は基本的に RESTful API に基づいて実装されており、ビジネスで高度なカスタマイズが必要な場合は、RESTful API を直接呼び出すことができます。 API を直接呼び出すには、コードに署名計算を含める必要があります。 詳細については、「CopyObject」をご参照ください。