Object Storage Service (OSS) は、マルチパートアップロード機能を提供します。 マルチパートアップロードを使用すると、大きなオブジェクトを複数のパートに分割してアップロードできます。 これらのパーツがアップロードされたら、CompleteMultipartUpload操作を呼び出して、パーツを完全なオブジェクトに結合できます。
背景情報
MultipartUpload
メソッドを使用して、ラージオブジェクトをアップロードできます。 マルチパートアップロードでは、オブジェクトは別々にアップロードされる複数のパートに分割されます。 一部のパーツがアップロードに失敗した場合、OSSはアップロードの進行状況を記録します。 アップロードを再開するときは、アップロードに失敗したパーツのみをアップロードする必要があります。
サイズが100 MBを超えるオブジェクトをアップロードするには、マルチパートアップロードを使用してアップロードの成功率を上げることを推奨します。 マルチパートアップロードを使用してサイズが100 MB未満のオブジェクトをアップロードし、partSizeパラメーターの値が不適切な場合、アップロードの進行状況が完全に表示されないことがあります。 サイズが100 MB未満のオブジェクトをアップロードするには、簡易アップロードを使用することを推奨します。
MultipartUpload
メソッドを使用するときにConnectionTimeoutError
エラーが発生した場合は、エラーを修正する必要があります。 部品サイズの縮小、タイムアウト期間の延長、またはリクエストの再送信を行うことができます。 ConnectionTimeoutError
エラーをキャプチャし、原因に基づいてエラーを修正することもできます。 詳細については、以下をご参照ください。 ネットワーク接続タイムアウト処理
次の表に、マルチパートアップロードを使用してオブジェクトをアップロードするときに設定できるパラメーターを示します。
カテゴリ | パラメーター | 説明 |
必要なパラメーター | name {String} | オブジェクトのフルパス。The full path of the object. パスにバケット名を含めないでください。 |
file {文字列 | ファイル} | アップロードするローカルファイルまたはHTML5ファイルのパス。 | |
[オプション] {Object} オプションパラメーター | [checkpoint] {オブジェクト} | マルチパートアップロードタスクの結果を記録するチェックポイントファイル。 再開可能アップロードを有効にする場合は、このパラメーターを設定する必要があります。 チェックポイントファイルには、アップロードの進行状況が保存されます。 部品のアップロードに失敗した場合、OSSはこのファイルに記録された進捗情報に基づいて部品のアップロードを再開できます。 ローカルファイルがアップロードされた後、進捗情報が格納されているファイルは削除されます。 |
[parallel] {数} | 同時にアップロードできるパーツの数。 既定値:5 特別な要件がない場合は、デフォルト値を使用します。 | |
[partSize] {Number} | 部品サイズ。 有効な値: 100 KB〜5 GB。 デフォルト値: 1*1024*1024 (1 MB) 。 特別な要件がない場合は、デフォルト値を使用します。 | |
[進行状況] {機能} | アップロードタスクの進行状況を照会するために使用されるコールバック関数。 コールバック関数はasync関数にすることができます。 コールバック関数は、次のパラメータを受け取ります。
| |
[meta] {オブジェクト} | ユーザーメタデータ。 ユーザーメタデータヘッダーの先頭に | |
[mime] {String} | Content-Typeリクエストヘッダー。 | |
[headers] {オブジェクト} | その他のヘッダー。 詳細については、「RFC 2616」をご参照ください。 例:
|
マルチパートアップロードの例
OSS SDK for Node.jsは、マルチパートアップロードタスクでのMD5検証をサポートしていません。 データの整合性を検証する必要がある場合は、マルチパートアップロードタスクの完了後にCRC-64ライブラリを使用することを推奨します。
次のサンプルコードでは、multipartUpload
メソッドを使用してマルチパートアップロードを実行する方法の例を示します。
const OSS = require('ali-OSS ');
const path = require("path");
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: 'yourbucketname'
});
const progress = (p, _checkpoint) => {
// オブジェクトのアップロードの進行状況を記録します。
console.log(p);
// マルチパートアップロードタスクに関するチェックポイント情報を記録します。
console.log(_checkpoint);
};
const headers = {
// オブジェクトのストレージクラスを指定します。
「x-oss-storage-classs」: 「標準」、
// オブジェクトのタグを指定します。 オブジェクトに複数のタグを指定できます。
'x-oss-tagging ': 'Tag1=1&Tag2=2' 、
// マルチパートアップロードタスクの初期化時に、同じ名前の既存のオブジェクトを上書きするかどうかを指定します。 この例では、このパラメーターはtrueに設定されています。これは、アップロードするオブジェクトと同じ名前の既存のオブジェクトが上書きされないことを示します。
'x-oss-forbid-overwrite': 'true'
}
// マルチパートアップロードタスクを開始します。
async関数multipartUpload() {
try {
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 次に、ローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 バケット名をフルパスに含めないでください。
// デフォルトでは、ローカルパスを指定せずにこのパラメーターをexamplefile.txtなどのローカルファイル名に設定すると、サンプルプログラムが属するプロジェクトのローカルパスからローカルファイルがアップロードされます。
const result = await client.multipartUpload('exampledir/exampleobject.txt ', path.normalize('D :\\ localpath\\examplefile.txt')), {
progress,
// ヘッダー、
// オブジェクトのメタデータを指定するメタパラメーターを設定します。 HeadObject操作を呼び出して、オブジェクトメタデータを取得できます。
meta: {
年: 2020,
人: 'test '、
},
});
console.log (結果);
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。
const head = await client.head('exampledir/exampleobject.txt ');
console.log(head);
} catch (e) {
// タイムアウト例外を処理します。
if (e.code === 'ConnectionTimeoutError') {
console.log('TimeoutError');
// ConnectionTimeoutError操作を行う
}
console.log(e);
}
}
multipartUpload();
上記のコードサンプルのmultipartUpload
メソッドには、initMultipartUpload、uploadPart、およびcompleteMultipartUpload操作が含まれています。 マルチパートアップロードを段階的に実行する場合は、上記の操作を順番に呼び出します。 詳細は、をご参照ください。initMultipartUpload、。uploadPart、および。completeMultipartUpload
マルチパートアップロードタスクのキャンセル
client.abortMultipartUpload
メソッドを使用して、マルチパートアップロードタスクをキャンセルできます。 マルチパートアップロードタスクをキャンセルした場合、アップロードIDを使用してパーツをアップロードすることはできず、アップロードされたパーツは削除されます。
次のサンプルコードは、マルチパートアップロードタスクをキャンセルする方法の例を示しています。
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: "yourbucketname" 、});
async関数abortMultipartUpload() {
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。
const name = "exampledir/exampleobject.txt";
// アップロードIDを指定します。 InitiateMultipartUpload操作の応答からアップロードIDを取得できます。
const uploadId = "0004B999EF518A1FE585B0C9360D ****";
const result = await client.abortMultipartUpload(name, uploadId);
console.log (結果);
}
abortMultipartUpload();
マルチパートアップロードタスクの一覧表示
client.listUploads
メソッドを使用すると、開始されたが完了またはキャンセルされていない、進行中のすべてのマルチパートアップロードタスクを一覧表示できます。
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: "yourbucketname" 、});
async関数listUploads(query = {}) {
// クエリには、prefix、marker、delimiter、upload-id-marker、max-uploadsのパラメーターを設定できます。
const result = await client.listUploads (クエリ);
result.uploads.forEach((アップロード) => {
// マルチパートアップロードタスクのアップロードIDを指定します。
console.log(upload.uploadId);
// すべてのパーツを完全なオブジェクトに結合し、オブジェクトの完全なパスを指定します。
console.lo g(upload.name);
});
}
const query = {
// 現在のリスト操作で返すマルチパートアップロードタスクの最大数を指定します。 max-uploadのデフォルト値と最大値はどちらも1000です。
"max-uploads": 1000、};
listUploads (クエリ);
アップロードしたパーツの一覧表示
client.listParts
メソッドを使用して、指定したアップロードIDを持つマルチパートアップロードタスクを使用してアップロードされたすべてのパーツを一覧表示できます。
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: "yourbucketname" 、});
async関数listParts() {
const query = {
// 現在のリスト操作で返す部品の最大数を指定します。 max-partsのデフォルト値と最大値はどちらも1000です。
"max-parts": 1000、
};
結果を出す;
do {
result = await client.listParts ()
// オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。
"exampledir/exampleobject.txt" 、
// InitiateMultipartUpload操作への応答からアップロードIDを取得します。 CompleteMultipartUpload操作を呼び出してマルチパートアップロードタスクを完了する前に、アップロードIDを取得する必要があります。
"0004B999EF518A1FE585B0C9360D ****" 、
query
);
// 次のリスト操作の開始位置を指定します。 このパラメーターの値より大きい部品番号を持つ部品のみが一覧表示されます。
query["part-number-marker"] = result.nextPartNumberMarker;
result.parts.forEach((part) => {
console.log(part.PartNumber);
console.log(part.LastModified);
console.log(part.ETag);
console.log(part.Size);
});
} while (result.isTruncated === "true");
}
listParts();
よくある質問
マルチパートアップロードを使用してアップロードされたオブジェクトのMD5ハッシュを取得するにはどうすればよいですか?
マルチパートアップロードを使用してアップロードされたオブジェクトのMD5ハッシュは、CompleteMultipartUpload操作への応答でContent-MD5ヘッダーとして返されます。
参考資料
マルチパートアップロードの完全なサンプルコードについては、『GitHub』をご参照ください。
OSS SDK for Node.jsがマルチパートアップロードを実行するために使用する
multipartUpload
メソッドには、次の3つのAPI操作が含まれます。マルチパートアップロードタスクをキャンセルするために呼び出すことができるAPI操作の詳細については、「AbortMultipartUpload」をご参照ください。
アップロードされたパーツを一覧表示するために呼び出すことができるAPI操作の詳細については、「ListParts」をご参照ください。
進行中のマルチパートアップロードタスクを一覧表示するために呼び出すことができるAPI操作の詳細については、「ListMultipartUploads」をご参照ください。 進行中のマルチパートアップロードタスクは、開始されたが完了またはキャンセルされていないタスクです。