このトピックでは、バケット内または同じリージョン内のバケット間でオブジェクトをコピーする方法について説明します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「OSSリージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。
オブジェクトをコピーするには、ソースオブジェクトに対する読み取り権限と、宛先バケットに対する読み取りおよび書き込み権限が必要です。
ソースバケットとターゲットバケットに保持ポリシーが設定されていないことを確認します。 それ以外の場合、エラーメッセージ指定したオブジェクトは不変です。 が返されます。
ソースバケットと宛先バケットは同じリージョンにある必要があります。 たとえば、中国 (杭州) リージョンにあるバケットから中国 (青島) リージョンにある別のバケットにオブジェクトをコピーすることはできません。
小さなオブジェクトをコピーする
コピー方法を使用すると、サイズが1 GBを超えないオブジェクトを同じバケット内または同じリージョン内の異なるバケット間でコピーできます。
同じバケット内のオブジェクトをコピーする
次のサンプルコードは、同じバケット内でオブジェクトをコピーする方法の例を示しています。
const OSS = require('ali-oss'); const client = new OSS({ // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou. region: 'yourRegion', // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. accessKeyId: process.env.OSS_ACCESS_KEY_ID, accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET, authorizationV4: true, // Specify the name of the bucket. Example: examplebucket. bucket: 'examplebucket', // Specify whether to enable HTTPS. If you set secure to true, HTTPS is enabled. // secure: true }) // Copy an object within a bucket. async function copySmallObjecInSameBucket() { try { // Specify the full paths of the source object and the destination object. Do not include the bucket name in the full paths. // Specify HTTP headers and metadata for the destination object. const result = await client.copy('destexampleobject.txt', 'srcexampleobject.txt', { // Configure the headers parameter to specify HTTP headers for the destination object. If you do not configure the headers parameter, the HTTP headers of the destination object are the same as the HTTP headers of the source object. The HTTP headers of the source object are copied. headers: { 'Cache-Control': 'no-cache', // If the ETag value of the source object is the same as the ETag value specified in the request, OSS copies the object and returns 200 OK. 'if-match': '5B3C1A2E053D763E1B002CC607C5****', // If the ETag value that you specify in the request is different from the ETag value of the source object, OSS copies the object and returns 200 OK. 'if-none-match': '5B3C1A2E053D763E1B002CC607C5****', // If the time that is specified in the request is earlier than the time when the object is modified, OSS copies the object and returns 200 OK. 'if-modified-since': '2021-12-09T07:01:56.000Z', // If the time that is specified in the request is later than the time when the object is modified, OSS copies the object and returns 200 OK. 'if-unmodified-since': '2021-12-09T07:01:56.000Z', // Specify the access control list (ACL) of the destination object. In this example, the ACL is set to private, which indicates that only the object owner and authorized users have read and write permissions on the object. 'x-oss-object-acl': 'private', // Specify tags for the object. You can specify multiple tags for the object at the same time. 'x-oss-tagging': 'Tag1=1&Tag2=2', // Specify whether the CopyObject operation overwrites an existing object that has the same name. In this example, this parameter is set to true, which specifies that the CopyObject operation does not overwrite an existing object that has the same name. 'x-oss-forbid-overwrite': 'true', }, // Configure the meta parameter to specify the metadata of the destination object. If you do not configure the meta parameter, the metadata of the destination object is the same as the metadata of the source object. The metadata of the source object is copied. meta: { location: 'hangzhou', year: 2015, people: 'mary', }, }); console.log(result); } catch (e) { console.log(e); } } copySmallObjecInSameBucket()
同じリージョンのバケット間でオブジェクトをコピーする
次のサンプルコードは、同じリージョンのバケット間でオブジェクトをコピーする方法の例を示しています。
const OSS = require('ali-oss'); const client = new OSS({ // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou. region: 'yourRegion', // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. accessKeyId: process.env.OSS_ACCESS_KEY_ID, accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET, authorizationV4: true, // Specify the name of the destination bucket. bucket: 'destexamplebucket', }); async function copySmallObjectBetweenBuckets() { try { // Specify the source object that you want to copy, the destination object to which you want to copy the source object, and the bucket in which the source object is stored. const result = await client.copy('destobject.txt', 'srcobject.txt', 'srcbucket', { // Configure the headers parameter to specify HTTP headers for the destination object. If you do not configure the headers parameter, the HTTP headers of the destination object are the same as the HTTP headers of the source object. The HTTP headers of the source object are copied. headers: { 'Cache-Control': 'no-cache', }, // Configure the meta parameter to specify the metadata of the destination object. If you do not configure the meta parameter, the metadata of the destination object is the same as the metadata of the source object. The metadata of the source object is copied. meta: { location: 'hangzhou', year: 2015, people: 'mary', }, }); console.log(result); } catch (e) { console.log(e); } } copySmallObjectBetweenBuckets()
大きなオブジェクトをコピーする
multipartUploadCopy
操作を使用して、サイズが1 GBを超えるオブジェクトを部分的にコピーできます。
次のサンプルコードは、同じリージョンのバケット間でオブジェクトをコピーする方法の例を示しています。
const OSS = require("ali-oss");
const client = new OSS({
// Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to oss-cn-hangzhou.
region: 'yourregion',
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// Specify the name of the bucket.
bucket: "destexamplebucket",
});
async function copyLargeObjectBetweenDifferentBuckets() {
try {
const copyheaders = {
// If the ETag value of the source object is the same as the ETag value that is specified in the request, OSS copies the object. Otherwise, OSS returns the HTTP status code 412 (PreconditionFailed).
"x-oss-copy-source-if-match": "5B3C1A2E053D763E1B002CC607C5****",
// If the ETag value of the source object is different from the ETag value that is specified in the request, OSS copies the object and returns 200 OK. Otherwise, OSS returns the HTTP status code 304 (NotModified).
"x-oss-copy-source-if-none-match": "5B3C1A2E053D763E1B002CC607C5****",
// If the time that is specified in the request is later than or the same as the time when the object is modified, OSS copies the object and returns 200 OK. Otherwise, OSS returns the HTTP status code 412 (PreconditionFailed).
"x-oss-copy-source-if-unmodified-since": "2022-12-09T07:01:56.000Z",
// If the time that is specified in the request is earlier than the time when the object is modified, OSS copies the object and returns 200 OK. Otherwise, OSS returns the HTTP status code 304 (NotModified).
"x-oss-copy-source-if-modified-since": "2022-12-09T07:01:56.000Z",
};
const headers = {
// Specify the caching behavior of the web page when the object is downloaded.
"Cache-Control": "no-cache",
// Specify the name of the object when the object is downloaded.
"Content-Disposition": "somename",
// Specify the content encoding format when the object is downloaded.
"Content-Encoding": "utf-8",
// Specify the validity period. Unit: milliseconds.
Expires: "1000",
};
let savedCpt;
// Specify the full path of the destination object. Do not include the bucket name in the full path. Example: destexampleobject1.txt.
const r1 = await client.multipartUploadCopy("destexampleobject1.txt", {
// Specify the full path of the source object. Do not include the bucket name in the full path. Example: srcexampleobject.txt.
sourceKey: "srcexampleobject.txt",
// Specify the name of the source bucket. Example: sourcebucket.
sourceBucketName: "sourcebucket",
copyheaders: copyheaders,
});
console.log(r1);
// Specify the full path of the destination object. Do not include the bucket name in the full path. Example: destexampleobject 2.txt.
const r2 = await client.multipartUploadCopy("destexampleobject2.txt", {
// Specify the full path of the source object. Do not include the bucket name in the full path. Example: srcexampleobject.txt.
sourceKey: "srcexampleobject.txt",
// Specify the name of the source bucket. Example: sourcebucket.
sourceBucketName: "sourcebucket",
}, {
// Specify the maximum number of parts that can be uploaded in parallel.
parallel: 4,
// Specify the part size.
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);
// Specify the full path of the destination object. Do not include the bucket name in the full path. Example: destexampleobject3.txt.
const r3 = await client.multipartUploadCopy("destexampleobject3.txt", {
// Specify the full path of the source object. Do not include the bucket name in the full path. Example: srcexampleobject.txt.
sourceKey: "srcexampleobject.txt",
// Specify the name of the source bucket. Example: sourcebucket.
sourceBucketName: "sourcebucket",
}, {
checkpoint: 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」をご参照ください。