Node.js でファイルをダウンロードする方法
ファイルをクラウド ストレージに保持するのではなく、ローカル ストレージにダウンロードすることには、いくつかの利点があります。これらには、より簡単なアクセス、インターネット接続なしでのアクセス、およびデータの完全な所有権が含まれます。
組み込みの Node.js モジュールを使用して、1 つまたは複数のファイルをダウンロードできます。代わりにサードパーティのライブラリを使用して、同じ結果を得ることができます。
サードパーティ ライブラリを使用せずにファイルをダウンロードする
Node.js を使用してファイルをダウンロードするには、サードパーティのパッケージを使用せずに、3 つのコア Node.js モジュールが必要です: fs、https、およびpath。
fsモジュールは、読み取り、作成、更新、削除、名前変更など、多くのファイル タスクをサポートしています。httpsモジュールは、リクエストを処理してレスポンスを配信する Web サーバーを作成します。pathモジュールは、ディレクトリおよびファイル パスと対話する方法を提供します。
これらのモジュールを使用すると、HTTP GET 要求を送信して Web サーバーからファイル リソースにアクセスし、ローカル システムにリソースのコピーを作成できます。
まず、必要なモジュールをインポートします。
const https = require('https');
const fs = require('fs');
const path = require('path');
URL からのファイル名を適切なデフォルト名として使用して保存する必要があります。path モジュールの.basename()メソッドを使用して、URL からファイルの名前を取得できます。このメソッドはパス引数を取り、パスの最後の部分を返します。
例えば:
const filename = path.basename(url);
次に、https.get()メソッドを呼び出して、サーバーからファイルを要求します。このメソッドは、URL を最初の引数として受け取り、応答のコールバック関数を 2 番目の引数として受け取ります。
最初の引数としてurl変数を渡し、次に、このメソッドが応答ストリームを受信したときに処理するコールバック関数を渡します。
https.get(url, (res) => {
})
コールバック関数では、fs.createWriteStream()メソッドを使用して新しい書き込み可能なストリームを作成し、ファイル名変数を引数として渡すことができます。
例えば:
const fileStream = fs.createWriteStream(filename);
res.pipe(fileStream);
createWriteStream()メソッドは、特に大量のデータを処理している場合に、データをファイルに書き込むプロセスを容易にします。
次に、pipe()メソッドは、GET 応答データ ストリームをfileStreamオブジェクトに送信します。
スクリプトがファイルのダウンロードを完了した後にメッセージをコンソールに記録するには、.on()イベント エミッターをfileStream変数にアタッチします。
fileStream.on('finish', () => {
fileStream.close();
console.log('Download finished');
});
fileStream オブジェクトは、すべてのデータをファイルに書き込んだときに終了イベントを発行します。.on()メソッドを介してこれをキャッチし、コールバック関数を提供してfileStreamを閉じ、メッセージをコンソールに記録します。
実行を改善し、スクリプトを効率的に再利用できるようにするには、URL を引数として受け取る関数でこのコードをラップします。
function downloadFile(url) {
const filename = path.basename(url);
https.get(url, (res) => {
const fileStream = fs.createWriteStream(filename);
res.pipe(fileStream);
fileStream.on('finish', () => {
fileStream.close();
console.log('Download finished')
});
})
}
関数を実行するには、関数を呼び出して、ダウンロードするファイルの URL を渡します。
downloadFile([file url]);
スクリプトを実行するには、ターミナルを開き、nodeに続けて JavaScript ファイルの名前を入力します。
node [script name]
このスクリプトは、 downloadFile()関数に渡したファイル URL をダウンロードし、作業ディレクトリに保存します。
ファイルのダウンロード時のエラー処理
Node.js では、ファイルのダウンロード時に、ストリームへの書き込み、サービス接続の不良、ファイル自体の問題などの特定のエラーが発生する可能性があります。問題に対処できるようにするには、これらのエラーが発生したときにエラー メッセージをログに記録することが重要です。
トライ/キャッチ ブロック
try-catch ブロックは、コード内の潜在的なエラーと例外を処理できるようにするプログラミング構造です。
try-and-catch ブロックは、try…catch ブロックを構成します。try ブロックのコードが最初に実行され、try ブロックが例外をスローした場合は catch ブロックのコードが実行されます。
try {
downloadFile([file url]);
} catch (error) {
console.log(error);
}
try/catch ブロックを使用して、ダウンロード関連のエラーを確実にキャッチできるようにします。その後、コンソールへのログ記録やダウンロードの再試行など、必要に応じてエラーを処理できます。
HTTP 応答ステータス コード
HTTP 応答のステータス コードは、特定の HTTP 要求が正常に実行されたかどうかを示します。
例えば:
https.get(url, (res) => {
const code = res.statusCode();
console.log(code)
const fileStream = fs.createWriteStream(filename);
});
リクエストが成功範囲外のステータス コード200-299を返す場合、リクエストに問題がありました。HTTPステータスコードを確認し、ステータスコードの意味を調べて、必要に応じてエラーに対処してください。
複数ファイルのダウンロード
node [スクリプト名]の実行時にファイルの URL を引数として渡すことで、複数のファイルを同時にダウンロードできます。このタスクを実行するには、スクリプトの特定の部分を変更する必要があります。
JavaScript では、nodeコマンドと一緒に渡される引数は、グローバルな Node.js オブジェクトのプロパティである process.argv で使用できます。このプロパティは、コマンド ライン引数の配列を返します。この配列の最初の要素は、実行する実際のコマンドであるnodeである必要があります。2 番目はスクリプト ファイル名で、その後の各引数は URL である必要があります。
複数のファイルを一度にダウンロードするには、配列をprocess.argvから変数に保存します。次に、slice() メソッドを実行して、URL ではない最初の 2 つの要素を削除します。
const args = process.argv;
const urls = args.slice(2);
slice()メソッドは、配列内の選択された要素から新しい配列を作成します。このメソッドは、指定された開始から指定された (非包括的) 終了までを選択します。
この場合、値 2 を渡すと、ノードコマンド名とスクリプト ファイル名が削除されます。
最後に、JavaScript の map メソッドを使用して、urls配列の各要素をdownloadFile()に渡します。
urls.map(url =>{
downloadFile(url)
});
コードを実行するには、JavaScript ファイルの名前とダウンロードする URL とともにnodeコマンドを入力します。
node [script name] url1 url2 url3
サードパーティ ライブラリの使用
npmダウンロードパッケージなどのサードパーティ ライブラリを使用してファイルをダウンロードすることもできます。
スクリプト ディレクトリ内で、次の npm コマンドを実行してダウンロードパッケージをインストールします。
npm install download
スクリプトでダウンロードしたパッケージを要求し、コマンドライン引数を配列に保存します。
const download = require('download');
const args = process.argv;
const urls = args.slice(2);
ダウンロードライブラリを使用してファイルをダウンロードできるようになりました。特定の目的に応じて、いくつかの方法でこれを行うことができます。
例えば:
async function downloadFile(urls){
await Promise.all(urls.map((url) => download(url, "files")))
};
downloadFile(urls);
downloadFile関数をasyncとして宣言し、特定のタスクがawaitキーワードで完了するまで待機するPromiseを作成します。urls配列をダウンロード関数にマップし、ファイルを保存するローカル フォルダーの名前 (この場合は“ files ” ) を渡します。
ローカル ファイル システムへのファイルのダウンロード
ノードの組み込み関数 (fs や https など) を使用すると、ファイル ダウンローダーを簡単に作成できます。さらに簡単にするために、ダウンロードなどのサードパーティ モジュールを使用できます。
どちらの方法でも、リモート サーバーからファイルをダウンロードして、ローカル ファイル システムに保存できます。ニーズに最適な方法を選択し、次の Node.js アプリケーションで使用する必要があります。
コメントを残す