このトピックでは、バケット内または同じリージョン内のバケット間でオブジェクトをコピーする方法について説明します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。
RAMユーザーを使用してオブジェクトをコピーする場合、RAMユーザーには、ソースオブジェクトに対する
oss:GetObject
読み取り権限と、宛先バケットに対するoss:GetObject
およびoss:PutObject
読み取りおよび書き込み権限が必要です。 RAMユーザーにカスタムポリシーをアタッチする方法の詳細については、「RAMポリシーの一般的な例」をご参照ください。ソースバケットとターゲットバケットに保持ポリシーが設定されていないことを確認します。 それ以外の場合、エラーメッセージ指定したオブジェクトは不変です。 が返されます。
ソースバケットと宛先バケットは同じリージョンにある必要があります。 たとえば、中国 (杭州) リージョンにあるバケットから中国 (青島) リージョンにある別のバケットにオブジェクトをコピーすることはできません。
小さなオブジェクトをコピーする
次のサンプルコードでは、$ossClient->copyObject
を使用して、サイズが1 GB未満のオブジェクトをコピーする方法の例を示します。
<?php
if (is_file(__DIR__) 。 '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__) 。 '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
OSS\Credentials\EnvironmentVariableCredentialsProviderを使用します。OSS\OssClientを使用します。OSS\CoreOssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。
$end point = "https://oss-cn-hangzhou.aliyuncs.com";
// ソースバケットの名前を指定します。 例: srcexamplebucket.
$from_bucket = "srcexamplebucket";
// ソースオブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: srcdir/exampleobject.txt。
$from_object = "srcdir/exampleobject.txt";
// 宛先バケットの名前を指定します。 宛先バケットは、ソースバケットと同じリージョンに配置する必要があります。 例: destexamplebucket。
// バケット内のオブジェクトをコピーする場合は、必ずソースバケットとターゲットバケットに同じバケット名を指定してください。
$to_bucket = "destexamplebucket";
// 宛先オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: destdir/exampleobject.txt。
$to_object = "destdir/exampleobject.txt";
$options=配列 (
'header'=> 配列 (
// 同じ名前の既存のオブジェクトをCopyObject操作で上書きするかどうかを指定します。 この例では、このパラメーターはtrueに設定されています。これは、CopyObject操作が同じ名前の既存のオブジェクトを上書きしないことを指定します。
// 'x-oss-forbid-overwrite' => 'true' 、
// リクエストで指定したETag値がソースオブジェクトのETag値と同じ場合、OSSはオブジェクトをコピーしてOK 200を返します。
// 'x-oss-copy-source-if-match' => '5B3C1A2E053D763E1B002CC **** '、
// リクエストで指定したETag値がソースオブジェクトのETag値と異なる場合、OSSはオブジェクトをコピーしてOK 200を返します。
// 'x-oss-copy-source-if-none-match' => '5B3C1A2E053D763E1B002CC **** '、
// リクエストで指定された時間がオブジェクトの変更時間と同じかそれ以降の場合、OSSはオブジェクトをコピーしてOK 200を返します。
// 'x-oss-copy-source-if-unmodified-since' => gmdate('2021-12-09T07:01:56.000Z') 、
// リクエストで指定された時刻が、オブジェクトが変更された実際の時刻よりも早い場合、OSSはオブジェクトをコピーしてOK 200を返します。
// 'x-oss-copy-source-if-modified-ince' => gmdate('2021-12-09T07:01:56.000Z') 、
// ターゲットオブジェクトのメタデータを設定するために使用されるメソッドを指定します。 メソッドをCOPYに設定すると、ソースオブジェクトのメタデータがターゲットオブジェクトにコピーされます。
// 'x-oss-metadata-directive' => 'COPY' 、
// OSSがオブジェクトを作成するときに、ターゲットオブジェクトの暗号化に使用されるサーバー側の暗号化アルゴリズムを指定します。
// 'x-oss-server-side-encryption' => 'KMS' 、
// KMSによって管理されるCMKを指定します。 このパラメーターは、x-oss-server-side-encryptionをKMSに設定した場合にのみ有効になります。
// 'x-oss-server-side-encryption-key-id' => '9468da86-3509-4f8d-a61e-6eab **** '、
// OSSがオブジェクトを作成するときに、宛先オブジェクトのACLを指定します。 この例では、ACLはprivateに設定されています。これは、オブジェクトの所有者と許可されたユーザーのみがオブジェクトに対する読み取りおよび書き込み権限を持っていることを示します。
// 'x-oss-object-acl' => 'private' 、
// 宛先オブジェクトのストレージクラスを指定します。 この例では、ストレージクラスはStandardに設定されています。
// 'x-oss-storage-class' => 'Standard' 、
// ターゲットオブジェクトに1つ以上のタグを指定します。
// 'x-oss-tagging' => 'k1=v1&k2=v2&k3=v3' 、
// ターゲットオブジェクトのタグを設定するために使用されるメソッドを指定します。 メソッドをCOPYに設定すると、ソースオブジェクトのタグがターゲットオブジェクトにコピーされます。
// 'x-oss-tagging-directive' => 'COPY' 、
),
);
try {
$config=配列 (
"provider" => $provider、
"endpoint" => $end ポイント、
);
$ossClient = new OssClient($config);
$ossClient->copyObject($from_bucket、$from_object、$to_bucket、$to_object);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage()) 。 "\n");
戻ります。}
print(__FUNCTION__) 。 ": OK" 。 "\n");
大きなオブジェクトをコピーする
サイズが1 GBを超えるオブジェクトをコピーするには、オブジェクトをパーツに分割し、UploadPartCopyを使用してパーツを順番にコピーする必要があります。 マルチパートコピーを実装するには、次の手順を実行します。
$ossClient->initiateMultipartUpload
を使用して、マルチパートコピータスクを開始します。マルチパートコピーを実行するには、
$ossClient->uploadPartCopy
を使用します。 最後の部分を除いて、すべての部分は100 KBより大きくなければなりません。$ossClient->completeMultipartUpload
を使用して、マルチパートコピータスクを完了します。
次のサンプルコードは、ラージオブジェクトをパーツごとにコピーする方法の例を示しています。
<?php
if (is_file(__DIR__) 。 '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__) 。 '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
OSS\Credentials\EnvironmentVariableCredentialsProviderを使用します。OSS\OssClientを使用します。OSS\CoreOssExceptionを使用します。// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 ビジネス要件に基づいてエンドポイントを指定します。
$end point = "http://oss-cn-hangzhou.aliyuncs.com";
// ソースバケットの名前を指定します。
$from_bucket = "yourSrcBucketName";
// ソースオブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: srcdir/exampleobject.txt。
$from_object = "yourSrcObjectName";
// 宛先バケットの名前を指定します。 宛先バケットは、ソースバケットと同じリージョンに配置する必要があります。
$to_bucket = "yourDestBucketName";
// 宛先オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: destdir/exampleobject.txt。
$to_object = 'yourDestObjectName';
// パーツサイズを指定します。 単位:バイト
$part_size = 256*1024*1024;
try {
$config=配列 (
"provider" => $provider、
"endpoint" => $end ポイント、
);
$ossClient = new OssClient($config);
$objectMeta = $ossClient->getObjectMeta($from_bucket、$from_object);
$length = $objectMeta['content-length '] + 0;
// マルチパートコピータスクを開始します。
$upload_id = $ossClient->initiateMultipartUpload($to_bucket, $to_object);
// マルチパートコピータスクを開始します。
$pieces = $ossClient->generateMultiuploadParts($length、$part_size);
$response_upload_part = array();
$copyId = 1;
$upload_position = 0;
foreach ($pieces as $i => $piece) {
$from_pos = $upload_position + (整数)$piece['seekTo'];
$to_pos = (整数)$piece['length '] + $from_pos - 1;
$up_options=配列 (
'start' => $from_pos、
'end' => $to_pos、
'header'=> 配列 (
// リクエストで指定したETag値がソースオブジェクトのETag値と同じ場合、OSSはオブジェクトをコピーしてOK 200を返します。
// 'x-oss-copy-source-if-match' => '5B3C1A2E053D763E1B002CC **** '、
// リクエストで指定したETag値がソースオブジェクトのETag値と異なる場合、OSSはオブジェクトをコピーしてOK 200を返します。
// 'x-oss-copy-source-if-none-match' => '5B3C1A2E053D763E1B002CC **** '、
// リクエストで指定された時間がオブジェクトの変更時間と同じかそれ以降の場合、OSSはオブジェクトをコピーしてOK 200を返します。
// 'x-oss-copy-source-if-unmodified-since' => gmdate('2021-12-09T07:01:56.000Z') 、
// リクエストで指定された時刻が、オブジェクトが変更された実際の時刻よりも早い場合、OSSはオブジェクトをコピーしてOK 200を返します。
// 'x-oss-copy-source-if-modified-ince' => gmdate('2021-12-09T07:01:56.000Z') 、
),
);
$response_upload_part[] = $ossClient->uploadPartCopy( $from_bucket、$from_object、$to_bucket、$to_object、$copyId、$upload_id、$up_options);
$copyId = $copyId + 1;
}
// マルチパートコピータスクを完了します。
$upload_parts = array();
foreach ($i => $etagとして $response_upload_part) {
$upload_parts[] = array(
'PartNumber' => ($i + 1),
'ETag' => $etag、
);
}
$result = $ossClient->completeMultipartUpload($to_bucket、$to_object、$upload_id、$upload_parts);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage()) 。 "\n");
戻ります。}
print(__FUNCTION__) 。 ": OK" 。 "\n");
参考資料
小さなオブジェクトをコピーする
小さなオブジェクトのコピーに使用される完全なサンプルコードについては、GitHubをご覧ください。
小さなオブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「CopyObject」をご参照ください。
大きなオブジェクトをコピーする
ラージオブジェクトのコピーに使用される完全なサンプルコードの詳細については、GitHubをご覧ください。
ラージオブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「UploadPartCopy」をご参照ください。