このトピックでは、バケット内または同じリージョン内のバケット間でオブジェクトをコピーする方法について説明します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。
オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、宛先バケットに対する読み取りおよび書き込み権限が必要です。
ソースバケットとターゲットバケットに保持ポリシーが設定されていないことを確認します。 それ以外の場合、エラーメッセージ指定したオブジェクトは不変です。 が返されます。
ソースバケットと宛先バケットは同じリージョンにある必要があります。 たとえば、中国 (杭州) リージョンにあるバケットから中国 (青島) リージョンにある別のバケットにオブジェクトをコピーすることはできません。
小さなオブジェクトをコピーする
コピー方法を使用すると、サイズが1 GBを超えないオブジェクトを同じバケット内または同じリージョン内の異なるバケット間でコピーできます。
同じバケット内のオブジェクトをコピーする
次のサンプルコードは、同じバケット内でオブジェクトをコピーする方法の例を示しています。
const OSS = require('ali-OSS '); const client = new OSS({ // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 リージョン: 'yourRegion' 、 // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 accessKeyId: process.env.OSS_ACCESS_KEY_ID、 accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、 // バケットの名前を指定します。 例: examplebucket. bucket: 'examplebucket' 、 // HTTPSを有効にするかどうかを指定します。 secureをtrueに設定すると、HTTPSが有効になります。 // secure: true }) // バケット内のオブジェクトをコピーします。 async関数copySmallObjectInSameBucket () { try { // ソースオブジェクトと宛先オブジェクトの完全なパスを指定します。 完全なパスにバケット名を含めないでください。 // 宛先オブジェクトのHTTPヘッダーとメタデータを指定します。 const result = await client.copy('destexampleobject.txt ', 'srcexampleobject.txt', { // headersパラメーターを設定して、宛先オブジェクトのHTTPヘッダーを指定します。 headersパラメーターを設定しない場合、宛先オブジェクトのHTTPヘッダーはソースオブジェクトのHTTPヘッダーと同じになります。 ソースオブジェクトのHTTPヘッダーがコピーされます。 ヘッダー:{ 「キャッシュ制御」: 「キャッシュなし」、 // ソースオブジェクトのETag値がリクエストで指定されたETag値と同じ場合、OSSはオブジェクトをコピーしてOK 200を返します。 'if-match': '5B3C1A2E053D763E1B002CC607C5 **** '、 // リクエストで指定したETag値がソースオブジェクトのETag値と異なる場合、OSSはオブジェクトをコピーしてOK 200を返します。 'if-none-match': '5B3C1A2E053D763E1B002CC607C5 **** '、 // リクエストで指定された時刻が、オブジェクトが変更された時刻よりも早い場合、OSSはオブジェクトをコピーしてOK 200を返します。 'if-modified-since ': '2021-12-09T07:01:56.000Z' 、 // リクエストで指定された時間がオブジェクトが変更された時間よりも遅い場合、OSSはオブジェクトをコピーしてOK 200を返します。 '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: { 場所: 'hangzhou' 、 年: 2015, 人々: 「メアリー」、 }, }); console.log (結果); } catch (e) { console.log(e); } } copySmallObjectInSameBucket ()
同じリージョンのバケット間でオブジェクトをコピーする
次のサンプルコードは、同じリージョンのバケット間でオブジェクトをコピーする方法の例を示しています。
const OSS = require('ali-OSS '); const client = new OSS({ // バケットが配置されているリージョンを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、リージョンをoss-cn-Hangzhouに設定します。 リージョン: 'yourRegion' 、 // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 accessKeyId: process.env.OSS_ACCESS_KEY_ID、 accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET、 // 宛先バケットの名前を指定します。 bucket: 'destexamplebucket' 、}); async関数copySmallObjectBetweenBuckets() { try { // コピーするソースオブジェクト、ソースオブジェクトのコピー先オブジェクト、およびソースオブジェクトが保存されているバケットを指定します。 const result = await client.copy('destobject.txt ', 'srcobject.txt', 'srcbucket', { // headersパラメーターを設定して、宛先オブジェクトのHTTPヘッダーを指定します。 headersパラメーターを設定しない場合、宛先オブジェクトのHTTPヘッダーはソースオブジェクトのHTTPヘッダーと同じになります。 ソースオブジェクトのHTTPヘッダーがコピーされます。 ヘッダー:{ 「キャッシュ制御」: 「キャッシュなし」、 }, // メタパラメーターを設定して、ターゲットオブジェクトのメタデータを指定します。 metaパラメーターを設定しない場合、ターゲットオブジェクトのメタデータはソースオブジェクトのメタデータと同じになります。 ソースオブジェクトのメタデータがコピーされます。 meta: { 場所: 'hangzhou' 、 年: 2015, 人々: 「メアリー」、 }, }); console.log (結果); } catch (e) { console.log(e); } } copySmallObjectBetweenBuckets()
大きなオブジェクトをコピーする
multipartUploadCopy
操作を使用して、サイズが1 GBを超えるオブジェクトを部分的にコピーできます。
次のサンプルコードは、同じリージョンのバケット間でオブジェクトをコピーする方法の例を示しています。
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、
// バケットの名前を指定します。
bucket: "destexamplebucket" 、});
async関数copyLargeObjectBetweenDifferentBuckets() {
try {
const copyheaders = {
// ソースオブジェクトのETag値がリクエストで指定されたETag値と同じ場合、OSSはオブジェクトをコピーします。 それ以外の場合、OSSはHTTPステータスコード412 (PreconditionFailed) を返します。
"x-oss-copy-source-if-match": "5B3C1A2E053D763E1B002CC607C5 ****" 、
// ソースオブジェクトのETag値がリクエストで指定されたETag値と異なる場合、OSSはオブジェクトをコピーしてOK 200を返します。 それ以外の場合、OSSはHTTPステータスコード304 (NotModified) を返します。
"x-oss-copy-source-if-none-match": "5B3C1A2E053D763E1B002CC607C5 ****" 、
// リクエストで指定された時間が、オブジェクトが変更された時間よりも後または同じである場合、OSSはオブジェクトをコピーしてOK 200を返します。 それ以外の場合、OSSはHTTPステータスコード412 (PreconditionFailed) を返します。
"x-oss-copy-source-if-unmodified-since": "2022-12-09T07:01:56.000Z" 、
// リクエストで指定された時刻が、オブジェクトが変更された時刻よりも早い場合、OSSはオブジェクトをコピーしてOK 200を返します。 それ以外の場合、OSSはHTTPステータスコード304 (NotModified) を返します。
"x-oss-copy-source-if-modified-since": "2022-12-09T07:01:56.000Z" 、
};
const headers = {
// オブジェクトのダウンロード時のwebページのキャッシュ動作を指定します。
"Cache-Control": "no-cache" 、
// オブジェクトのダウンロード時にオブジェクトの名前を指定します。
"コンテンツ-処分": "somename" 、
// オブジェクトのダウンロード時のコンテンツエンコーディング形式を指定します。
"コンテンツエンコード": "utf-8" 、
// 有効期間を指定します。 単位:ミリ秒。
有効期限: 「1000」、
};
savedCptを許可します。
// 宛先オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: destexampleobject1.txt。
const r1 = await client.multipartUploadCopy("destexampleobject1.txt", {
// ソースオブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: srcexampleobject.txt。
sourceKey: "srcexampleobject.txt" 、
// ソースバケットの名前を指定します。 例: sourcebucket。
sourceBucketName: "sourcebucket" 、
copyheaders: copyheaders、
});
console.log(r1);
// 宛先オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: destexampleobject 2.txt.
const r2 = await client.multipartUploadCopy("destexampleobject2.txt", {
// ソースオブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: srcexampleobject.txt。
sourceKey: "srcexampleobject.txt" 、
// ソースバケットの名前を指定します。 例: sourcebucket。
sourceBucketName: "sourcebucket" 、
}, {
// 並列にアップロードできるパーツの最大数を指定します。
パラレル: 4,
// パーツサイズを指定します。
partSize: 1024*1024、
progress: function (p, cpt, res) {
console.log(p);
savedCpt = cpt;
console.log(cpt);
console.log(res.headers["x-oss-request-id"]);
},
headers: headers,
copyheaders: copyheaders、
});
console.log(r2);
// 宛先オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: destexampleobject3.txt。
const r3 = await client.multipartUploadCopy("destexampleobject3.txt", {
// ソースオブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: srcexampleobject.txt。
sourceKey: "srcexampleobject.txt" 、
// ソースバケットの名前を指定します。 例: sourcebucket。
sourceBucketName: "sourcebucket" 、
}, {
チェックポイント: savedCpt、
progress: function (p, cpt, res) {
console.log(p);
console.log(cpt);
console.log(res.headers["x-oss-request-id"]);
},
});
console.log(r3);
} catch (e) {
console.log(e);
}
}
copyLargeObjectBetweenDifferentBuckets()
参考資料
小さなオブジェクトをコピーする
小さなオブジェクトのコピーに使用される完全なサンプルコードについては、GitHubをご覧ください。
小さなオブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「CopyObject」をご参照ください。
大きなオブジェクトをコピーする
ラージオブジェクトのコピーに使用される完全なサンプルコードの詳細については、GitHubをご覧ください。
ラージオブジェクトをコピーするために呼び出すことができるAPI操作の詳細については、「UploadPartCopy」をご参照ください。