Node.js v2 用のクライアント ライブラリを使用して BLOB をアップロード、ダウンロード、および一覧表示する方法How to upload, download, and list blobs using the client library for Node.js v2

このハウツー ガイドでは、Node.js v2 用のクライアント ライブラリを使用して、Azure Blob Storage に対して BLOB をアップロード、ダウンロード、および一覧表示する方法について説明します。In this how-to guide, you learn how to use the client library for Node.js v2 to upload, download, and list blobs with Azure Blob storage.

ヒント

Node.js 用の Azure Storage クライアント ライブラリの最新バージョンは v10 です。The latest version of the Azure Storage client library for Node.js is v10. 可能であれば、クライアント ライブラリの最新バージョンを使用することをお勧めします。Microsoft recommends that you use the latest version of the client library when possible. V10 の使用を開始するには、「クイック スタート: JavaScript 用の Azure Storage クライアント ライブラリ v10 を使用して BLOB のアップロード、ダウンロード、一覧表示、および削除を行う方法 (プレビュー) に関するページを参照してください。To get started using v10, see Quickstart: Upload, download, list, and delete blobs using Azure Storage client library for JavaScript v10 (preview).

前提条件Prerequisites

Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。If you don't have an Azure subscription, create a free account before you begin.

Azure portal で Azure ストレージ アカウントを作成します。Create an Azure storage account in the Azure portal. アカウントの作成については、「ストレージ アカウントの作成」を参照してください。For help creating the account, see Create a storage account.

サンプル アプリケーションのダウンロードDownload the sample application

サンプル アプリケーションは、単純な Node.js コンソール アプリケーションです。The sample application is a simple Node.js console application. 開始するには、次のコマンドを使用して、お使いのマシンにリポジトリを複製します。To begin, clone the repository to your machine using the following command:

git clone https://github.com/Azure-Samples/storage-blobs-node-quickstart.git

アプリケーションを開くには、storage-blobs-node-quickstart フォルダーを探して、任意のコード編集環境で開きます。To open the application, look for the storage-blobs-node-quickstart folder and open it in your favorite code editing environment.

Azure Portal で資格情報をコピーするCopy your credentials from the Azure portal

サンプル アプリケーションは、ストレージ アカウントへのアクセスを認証する必要があります。The sample application needs to authenticate access to your storage account. 認証するには、ストレージ アカウントの資格情報を接続文字列としてアプリケーションに追加します。To authenticate, add your storage account credentials to the application as a connection string. 次の手順に従って、ストレージ アカウントの資格情報を表示します。View your storage account credentials by following these steps:

  1. Azure Portal に移動します。Navigate to the Azure portal.

  2. 自分のストレージ アカウントを探します。Locate your storage account.

  3. ストレージ アカウントの概要の [設定] セクションで、 [アクセス キー] を選択します。In the Settings section of the storage account overview, select Access keys. ここでは、アカウント アクセス キーと各キーの完全な接続文字列を表示できます。Here, you can view your account access keys and the complete connection string for each key.

  4. [Key1][接続文字列] の値を見つけ、 [コピー] ボタンを選択して接続文字列をコピーします。Find the Connection string value under key1, and select the Copy button to copy the connection string. すぐ後の手順で、接続文字列の値を環境変数に追加します。You will add the connection string value to an environment variable in the next step.

    Azure portal から接続文字列をコピーする方法を示すスクリーンショット

ストレージ接続文字列の構成Configure your storage connection string

アプリケーションを実行する前に、ストレージ アカウントの接続文字列を指定する必要があります。Before running the application, you must provide the connection string for your storage account. サンプル リポジトリには、 .env.example という名前のファイルが含まれています。The sample repository includes a file named .env.example. このファイル名から .example 拡張子を削除して、 .env というファイル名に変更できます。You can rename this file by removing the .example extension, which results in a file named .env. .env ファイル内で、AZURE_STORAGE_CONNECTION_STRING キーの後ろに接続文字列の値を追加します。Inside the .env file, add your connection string value after the AZURE_STORAGE_CONNECTION_STRING key.

必要なパッケージをインストールするInstall required packages

アプリケーション ディレクトリで npm install を実行して、アプリケーションに必要なパッケージをインストールします。In the application directory, run npm install to install the required packages for the application.

npm install

サンプルを実行するRun the sample

これで依存関係がインストールされたので、次のコマンドを発行することによってサンプルを実行できます。Now that the dependencies are installed, you can run the sample by issuing the following command:

npm start

スクリプトからの出力は次のようになります。The output from the script will be similar to the following:

Containers:
 - container-one
 - container-two
Container "demo" is created
Blob "quickstart.txt" is uploaded
Local file "./readme.md" is uploaded
Blobs in "demo" container:
 - quickstart.txt
 - readme.md
Blob downloaded blob content: "hello Blob SDK"
Blob "quickstart.txt" is deleted
Container "demo" is deleted
Done

このサンプル用の新しいストレージ アカウントを使用している場合は、 "Containers" のラベルの下にコンテナー名が表示されない可能性があります。If you are using a new storage account for this example, then you may not see any container names listed under the label "Containers".

コードについてUnderstanding the code

最初の式は、環境変数に値を読み込むために使用されます。The first expression is used to load values into environment variables.

if (process.env.NODE_ENV !== 'production') {
    require('dotenv').load();
}

dotenv モジュールは、デバッグのためにアプリをローカルで実行しているときに環境変数を読み込みます。The dotenv module loads environment variables when running the app locally for debugging. 値は .env という名前のファイルで定義され、現在の実行コンテキストに読み込まれます。Values are defined in a file named .env and loaded into the current execution context. 運用コンテキストでは、これらの値はサーバー構成によって提供されます。このコードが、スクリプトが "運用" コンテキストで実行されていない場合にのみ実行されるのはそのためです。In production contexts, the server configuration provides these values and that is why this code is only run when the script is not running under a "production" context.

const path = require('path');
const storage = require('azure-storage');

各モジュールの目的は次のとおりです。The purpose of the modules is as follows:

.env という名前のファイルを現在の実行コンテキストに読み込みます。file named .env into the current execution context

次に、blobService 変数が Azure Blob service の新しいインスタンスとして初期化されます。Next, the blobService variable is initialized as a new instance of the Azure Blob service.

const blobService = storage.createBlobService();

次の実装では、blobService の各関数は Promise にラップされます。これにより、JavaScript の async 関数と await 演算子にアクセスして Azure Storage API のコールバックの性質を合理化できます。In the following implementation, each of the blobService functions is wrapped in a Promise, which allows access to JavaScript's async function and await operator to streamline the callback nature of the Azure Storage API. 各関数に対して正常な応答が返されると、アクションに固有のメッセージと関連データを使用して Promise が解決されます。When a successful response returns for each function, the promise resolves with relevant data along with a message specific to the action.

コンテナーの一覧表示List containers

listContainers 関数は、グループ内のコンテナーのコレクションを返す listContainersSegmented を呼び出します。The listContainers function calls listContainersSegmented which returns collections of containers in groups.

const listContainers = async () => {
    return new Promise((resolve, reject) => {
        blobService.listContainersSegmented(null, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `${data.entries.length} containers`, containers: data.entries });
            }
        });
    });
};

グループのサイズは、ListContainersOptions で構成できます。The size of the groups is configurable via ListContainersOptions. listContainersSegmented を呼び出すと、BLOB メタデータが ContainerResult インスタンスの配列として返されます。Calling listContainersSegmented returns blob metadata as an array of ContainerResult instances. 結果は 5,000 の増分バッチ (セグメント) で返されます。Results are returned in 5,000 increment batches (segments). コンテナー内に 5,000 を超える BLOB がある場合は、結果に continuationToken の値が含まれます。If there are more than 5,000 blobs in a container, then the results include a value for continuationToken. BLOB コンテナーから後続のセグメントを一覧表示するには、この継続トークンを 2 番目の引数として listContainersSegment に戻すことができます。To list subsequent segments from the blob container, you can pass the continuation token back into listContainersSegment as the second argument.

コンテナーを作成するCreate a container

createContainer 関数は createContainerIfNotExists を呼び出し、BLOB に適切なアクセス レベルを設定します。The createContainer function calls createContainerIfNotExists and sets the appropriate access level for the blob.

const createContainer = async (containerName) => {
    return new Promise((resolve, reject) => {
        blobService.createContainerIfNotExists(containerName, { publicAccessLevel: 'blob' }, err => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Container '${containerName}' created` });
            }
        });
    });
};

createContainerIfNotExists の 2 番目のパラメーター ("オプション") は、publicAccessLevel の値を受け取ります。The second parameter (options) for createContainerIfNotExists accepts a value for publicAccessLevel. publicAccessLevel の値 blob は、特定の BLOB データがパブリックに公開されることを示します。The value blob for publicAccessLevel specifies that specific blob data is exposed to the public. この設定は、コンテナーの内容を一覧表示する権限を付与する container レベル アクセスとは対照的です。This setting is in contrast to container level access, which grants the ability to list the contents of the container.

createContainerIfNotExists を使用すると、コンテナーが既に存在する場合でも、アプリケーションはエラーを返すことなく createContainer コマンドを複数回実行できます。The use of createContainerIfNotExists allows the application to run the createContainer command multiple times without returning errors when the container already exists. 運用環境では、アプリケーション全体で同じコンテナーが使用されるため、多くの場合 createContainerIfNotExists は 1 回だけ呼び出されます。In a production environment, you often only call createContainerIfNotExists once as the same container is used throughout the application. このような場合は、ポータルや Azure CLI を使用して、事前にコンテナーを作成できます。In these cases, you can create the container ahead of time through the portal or via the Azure CLI.

テキストをアップロードするUpload text

uploadString 関数は、createBlockBlobFromText を呼び出して BLOB コンテナーに任意の文字列を書き込みます (または上書きします)。The uploadString function calls createBlockBlobFromText to write (or overwrite) an arbitrary string to the blob container.

const uploadString = async (containerName, blobName, text) => {
    return new Promise((resolve, reject) => {
        blobService.createBlockBlobFromText(containerName, blobName, text, err => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Text "${text}" is written to blob storage` });
            }
        });
    });
};

ローカル ファイルをアップロードするUpload a local file

uploadLocalFile 関数は、createBlockBlobFromLocalFile を使用して、ファイル システムから Blob Storage にファイルをアップロードして書き込みます (または上書きします)。The uploadLocalFile function uses createBlockBlobFromLocalFile to upload and write (or overwrite) a file from the file system into blob storage.

const uploadLocalFile = async (containerName, filePath) => {
    return new Promise((resolve, reject) => {
        const fullPath = path.resolve(filePath);
        const blobName = path.basename(filePath);
        blobService.createBlockBlobFromLocalFile(containerName, blobName, fullPath, err => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Local file "${filePath}" is uploaded` });
            }
        });
    });
};

BLOB へのコンテンツのアップロードに使用できる他のアプローチとしては、textstreams の操作があります。Other approaches available to upload content into blobs include working with text and streams. ファイルが Blob Storage にアップロードされたことを確認するには、Azure Storage Explorer を使用して、自分のアカウントでデータを表示します。To verify the file is uploaded to your blob storage, you can use the Azure Storage Explorer to view the data in your account.

BLOB を一覧表示するList the blobs

listBlobs 関数は、listBlobsSegmented メソッドを呼び出して、コンテナー内の BLOB メタデータの一覧を返します。The listBlobs function calls the listBlobsSegmented method to return a list of blob metadata in a container.

const listBlobs = async (containerName) => {
    return new Promise((resolve, reject) => {
        blobService.listBlobsSegmented(containerName, null, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `${data.entries.length} blobs in '${containerName}'`, blobs: data.entries });
            }
        });
    });
};

listBlobsSegmented を呼び出すと、BlobResult インスタンスの配列として BLOB メタデータが返されます。Calling listBlobsSegmented returns blob metadata as an array of BlobResult instances. 結果は 5,000 の増分バッチ (セグメント) で返されます。Results are returned in 5,000 increment batches (segments). コンテナー内に 5,000 を超える BLOB がある場合は、結果に continuationToken の値が含まれます。If there are more than 5,000 blobs in a container, then the results include a value for continuationToken. BLOB コンテナーから後続のセグメントを一覧表示するには、この継続トークンを 2 番目の引数として listBlobSegmented に戻します。To list subsequent segments from the blob container, you can pass the continuation token back into listBlobSegmented as the second argument.

BLOB をダウンロードするDownload a blob

downloadBlob 関数は、getBlobToText を使用して、BLOB のコンテンツを指定された絶対ファイル パスにダウンロードします。The downloadBlob function uses getBlobToText to download the contents of the blob to the given absolute file path.

const downloadBlob = async (containerName, blobName) => {
    const dowloadFilePath = path.resolve('./' + blobName.replace('.txt', '.downloaded.txt'));
    return new Promise((resolve, reject) => {
        blobService.getBlobToText(containerName, blobName, (err, data) => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Blob downloaded "${data}"`, text: data });
            }
        });
    });
};

ここでに示されている実装では、ソースを変更し、BLOB のコンテンツを文字列として返します。The implementation shown here changes the source returns the contents of the blob as a string. ローカル ファイルに直接ダウンロードするだけでなく、BLOB をストリームとしてダウンロードすることもできます。You can also download the blob as a stream as well as directly to a local file.

BLOB を削除するDelete a blob

deleteBlob 関数は、deleteBlobIfExists 関数を呼び出します。The deleteBlob function calls the deleteBlobIfExists function. 名前が示すとおり、この関数は BLOB が既に削除されていてもエラーを返しません。As the name implies, this function does not return an error if the blob is already deleted.

const deleteBlob = async (containerName, blobName) => {
    return new Promise((resolve, reject) => {
        blobService.deleteBlobIfExists(containerName, blobName, err => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Block blob '${blobName}' deleted` });
            }
        });
    });
};

コンテナーを削除するDelete a container

コンテナーは、Blob service の deleteContainer メソッドを呼び出し、コンテナー名を渡すことによって削除されます。Containers are deleted by calling the deleteContainer method off the blob service and passing in the container name.

const deleteContainer = async (containerName) => {
    return new Promise((resolve, reject) => {
        blobService.deleteContainer(containerName, err => {
            if (err) {
                reject(err);
            } else {
                resolve({ message: `Container '${containerName}' deleted` });
            }
        });
    });
};

コードの呼び出しCalling code

JavaScript の async/await 構文をサポートするために、すべての呼び出し元コードが execute という名前の関数内にラップされます。In order to support JavaScript's async/await syntax, all the calling code is wrapped in a function named execute. その後、execute が呼び出され、promise として処理されます。Then execute is called and handled as a promise.

async function execute() {
    // commands 
}

execute().then(() => console.log("Done")).catch((e) => console.log(e));

次のコードはすべて、execute 関数内の // commands コメントが記載された場所で実行されます。All of the following code runs inside the execute function where the // commands comment is placed.

最初に、名前やサンプル コンテンツを割り当てたり、Blob Storage にアップロードするローカル ファイルを指したりする関連する変数が宣言されます。First, the relevant variables are declared to assign names, sample content and to point to the local file to upload to Blob storage.

const containerName = "demo";
const blobName = "quickstart.txt";
const content = "hello Node SDK";
const localFilePath = "./readme.md";
let response;

ストレージ アカウント内のコンテナーを一覧表示するために、listContainers 関数が呼び出され、返されたコンテナーの一覧が出力ウィンドウにログ記録されます。To list the containers in the storage account, the listContainers function is called and the returned list of containers is logged to the output window.

console.log("Containers:");
response = await listContainers();
response.containers.forEach((container) => console.log(` -  ${container.name}`));

コンテナーの一覧が使用可能になったら、配列の findIndex メソッドを使用して、作成するコンテナーが既に存在するかどうかを確認できます。Once the list of containers is available, then you can use the Array findIndex method to see if the container you want to create already exists. コンテナーが存在しない場合は、そのコンテナーが作成されます。If the container does not exist then the container is created.

const containerDoesNotExist = response.containers.findIndex((container) => container.name === containerName) === -1;

if (containerDoesNotExist) {
    await createContainer(containerName);
    console.log(`Container "${containerName}" is created`);
}

次に、文字列とローカル ファイルが Blob Storage にアップロードされます。Next, a string and a local file is uploaded to Blob storage.

await uploadString(containerName, blobName, content);
console.log(`Blob "${blobName}" is uploaded`);

response = await uploadLocalFile(containerName, localFilePath);
console.log(response.message);

BLOB を一覧表示するプロセスは、コンテナーの一覧表示と同じです。The process to list blobs is the same as listing containers. listBlobs を呼び出すと、コンテナー内の BLOB の配列が返され、出力ウィンドウにログ記録されます。The call to listBlobs returns an array of blobs in the container and are logged to the output window.

console.log(`Blobs in "${containerName}" container:`);
response = await listBlobs(containerName);
response.blobs.forEach((blob) => console.log(` - ${blob.name}`));

BLOB をダウンロードするために、応答がキャプチャされ、BLOB の値にアクセスするために使用されます。To download a blob, the response is captured and used to access the value of the blob. その応答から、readableStreamBody が文字列に変換され、出力ウィンドウにログ記録されます。From the response readableStreamBody is converted to a string and logged out to the output window.

response = await downloadBlob(containerName, blobName);
console.log(`Downloaded blob content: "${response.text}"`);

最後に、BLOB とコンテナーがストレージ アカウントから削除されます。Finally, the blob and container are deleted from the storage account.

await deleteBlob(containerName, blobName);
console.log(`Blob "${blobName}" is deleted`);

await deleteContainer(containerName);
console.log(`Container "${containerName}" is deleted`);

リソースのクリーンアップClean up resources

ストレージ アカウントに書き込まれたデータはすべて、サンプル コードの最後で自動的に削除されます。All data written to the storage account is automatically deleted at the end of the code sample.

BLOB を使用する Node.js アプリケーションを開発するためのリソースResources for developing Node.js applications with blobs

Blob Storage を使用する Node.js 開発については、以下の追加リソースを参照してください。See these additional resources for Node.js development with Blob storage:

バイナリとソース コードBinaries and source code

クライアント ライブラリ リファレンスとサンプルClient library reference and samples

次の手順Next steps

この記事では、Node.js を使ってローカル ディスクと Azure Blob Storage の間でファイルをアップロードする方法について説明しました。This article demonstrates how to upload a file between a local disk and Azure Blob storage using Node.js. Blob Storage の操作の詳細を学習するには、GitHub リポジトリに進んでください。To learn more about working with Blob storage, continue to the GitHub repository.