ホームページ >ウェブフロントエンド >フロントエンドQ&A >Nodejsでファイルをダウンロードする方法

Nodejsでファイルをダウンロードする方法

WBOY
WBOYオリジナル
2023-05-11 20:29:084320ブラウズ

Node.js は、サーバー側で JavaScript コードを実行できる JavaScript ランタイム環境で実行される、オープンソースのクロスプラットフォームの JavaScript ランタイムです。 Node.js は、高性能でスケーラブルな Web アプリケーションの開発に広く使用されています。その中でもファイルのダウンロードはWebサイトの基本機能の一つですが、Node.jsでもファイルのダウンロード機能を簡単に実装できます。この記事では、Node.js でファイルをダウンロードする方法について詳しく説明します。

1. HTTP モジュールを使用してファイルをダウンロードする

Node.js では、HTTP モジュールを使用してファイルをダウンロードできます。 HTTP モジュールは Node.js のコア モジュールの 1 つで、HTTP クライアントとサーバーを作成するための API を提供します。

  1. ファイルをダウンロードするための基本手順

ファイルをダウンロードするには、次の基本手順を実行する必要があります:

(1) HTTP リクエストを作成します。

(2) HTTP リクエストを送信します。

(3) 応答をファイルに書き込みます。

以下は基本コードです:

const http = require('http');
const fs = require('fs');

const fileUrl = 'http://example.com/file.pdf';
const filePath = './file.pdf';

const request = http.get(fileUrl, (response) => {
  const fileStream = fs.createWriteStream(filePath);
  response.pipe(fileStream);
});

request.on('error', (err) => {
  console.error(`请求下载文件出错: ${err.message}`);
});

request.end();

上記のコードでは、まず HTTP モジュールの get メソッドを通じて HTTP リクエストを作成します。リクエストのコールバック関数では、書き込み可能なファイル ストリームを作成し、パイプを通じてファイル ストリームにレスポンスを書き込み、ファイルをディスクに書き込みます。

  1. ダウンロードの進行状況の処理

大きなファイルのダウンロードの場合、ダウンロードの進行状況を把握することが非常に重要です。組み込みの Content-Length ヘッダーを使用してファイルのサイズを取得し、組み込みの progress イベントを使用してダウンロードの進行状況を追跡できます。以下に例を示します。

const http = require('http');
const fs = require('fs');

const url = 'http://example.com/file.zip';
const filePath = './file.zip';

http.get(url, (response) => {
  const contentLength = parseInt(response.headers['content-length']);
  let downloadedLength = 0;

  response.pipe(fs.createWriteStream(filePath));

  response.on('data', (chunk) => {
    downloadedLength += chunk.length;
    const percent = downloadedLength / contentLength * 100;
    console.log(`${percent}% downloaded`);
  });

  response.on('end', () => {
    console.log('下载完成');
  });
}).on('error', (err) => {
  console.error(`请求下载文件出错: ${err.message}`);
});

上記のコードでは、組み込みの data イベントを使用してダウンロードの進行状況を追跡し、Content-Lengthダウンロードの割合を計算するためのヘッダー。ダウンロードが完了すると、「ダウンロードが完了しました」というメッセージが出力されます。

  1. リダイレクトの処理

ファイルのダウンロード リンクがリダイレクトされる場合があります。応答のステータス コードが 301 か 302 かを確認し、Location ヘッダーを使用してリダイレクトされたリンクを取得できます。サンプル コードは次のとおりです。

const http = require('http');
const https = require('https');
const fs = require('fs');

function downloadFile(url, filePath) {
  const httpClient = url.startsWith('https') ? https : http;

  httpClient.get(url, (response) => {
    const { statusCode } = response;

    if (statusCode === 301 || statusCode === 302) {
      console.warn(`文件重定向: ${response.headers.location}`);
      downloadFile(response.headers.location, filePath);
      return;
    }

    if (statusCode !== 200) {
      console.error(`请求下载文件出错: 状态码 ${statusCode}`);
      return;
    }

    response.pipe(fs.createWriteStream(filePath)).on('close', () => {
      console.log('下载完成');
    });
  }).on('error', (err) => {
    console.error(`请求下载文件出错: ${err.message}`);
  });
}

const url = 'http://example.com/file.zip';
const filePath = './file.zip';

downloadFile(url, filePath);

上記のコードでは、httpClient 変数を使用してプロトコル (http または https) を確認し、statusCode を使用して応答を確認します。ステータスコード。 301または302の場合は、リダイレクトされたメッセージを出力し、ファイルを再ダウンロードしてください。 200以外の場合はエラーメッセージが出力されます。

2. Request モジュールを使用してファイルをダウンロードする

Node.js には、HTTP モジュールに加えて、ファイルのダウンロードに使用できる一般的なサードパーティ モジュールもいくつかあります。最も人気のあるのは Request モジュールです。 Request モジュールは、Mikeal Rogers によって作成された、シンプルで強力、そしてユーザーフレンドリーな HTTP クライアントです。

  1. Request モジュールのインストール

ファイルのダウンロードに Request モジュールを使用するには、まずそれをインストールする必要があります。コマンド ラインで次のコマンドを実行してインストールできます。

npm install request --save
  1. ファイルをダウンロードするための基本的な手順

Request モジュールを使用してファイルをダウンロードするための基本的な手順は、次のようになります。 HTTPモジュールを使用します。以下は簡単な例です。

const request = require('request');
const fs = require('fs');

const url = 'http://example.com/file.zip';
const filePath = './file.zip';

request(url)
  .pipe(fs.createWriteStream(filePath))
  .on('finish', () => {
    console.log('下载完成');
  })
  .on('error', (err) => {
    console.error(`请求下载文件出错: ${err.message}`);
  });

上記のコードでは、request メソッドを使用して HTTP リクエストを作成し、パイプ経由でファイル ストリームに応答を書き込みます。ダウンロードが完了すると、「ダウンロードが完了しました」というメッセージが出力されます。

  1. ダウンロードの進行状況の処理

ダウンロードの進行状況を処理するには、request メソッドによって返されるリクエスト オブジェクトを使用できます。ファイルのサイズは、組み込みの Content-Length ヘッダーを使用して取得できます。さらに、Request モジュールは、ダウンロードの進行状況を追跡できる組み込みの progress イベントを提供します。以下に例を示します。

const request = require('request');
const fs = require('fs');

const url = 'http://example.com/file.zip';
const filePath = './file.zip';

const fileStream = fs.createWriteStream(filePath);
let downloadedLength = 0;

request(url)
  .on('response', (response) => {
    const contentLength = parseInt(response.headers['content-length']);
    console.log(`文件大小: ${(contentLength / 1024 / 1024).toFixed(2)} MB`);

    response.on('data', (data) => {
      downloadedLength += data.length;
      const percent = downloadedLength / contentLength * 100;
      console.log(`${percent.toFixed(2)}% downloaded`);
    });
  })
  .pipe(fileStream)
  .on('finish', () => {
    console.log('下载完成');
  })
  .on('error', (err) => {
    console.error(`请求下载文件出错: ${err.message}`);
  });

上記のコードでは、response イベントを使用してファイルのサイズを取得し、組み込みの data イベントを使用してファイルのサイズを取得します。ダウンロードの割合を計算して出力します。

  1. リダイレクトの処理

HTTP モジュールと同様に、Request モジュールを使用してファイル ダウンロード リンクのリダイレクトを処理することもできます。以下に例を示します。

const request = require('request');
const fs = require('fs');

const url = 'http://example.com/file.pdf';
const filePath = './file.pdf';

function downloadFile(url, filePath) {
  request(url)
    .on('response', (response) => {
      const { statusCode } = response;

      if (statusCode === 301 || statusCode === 302) {
        console.warn(`文件重定向: ${response.headers.location}`);
        downloadFile(response.headers.location, filePath);
        return;
      }

      if (statusCode !== 200) {
        console.error(`请求下载文件出错: 状态码 ${statusCode}`);
        return;
      }

      response.pipe(fs.createWriteStream(filePath)).on('finish', () => {
        console.log('下载完成');
      });
    })
    .on('error', (err) => {
      console.error(`请求下载文件出错: ${err.message}`);
    });
}

downloadFile(url, filePath);

上記のコードでは、statusCode を使用して応答のステータス コードを確認します。 301または302の場合は、リダイレクトされたメッセージを出力し、ファイルを再ダウンロードしてください。 200以外の場合はエラーメッセージが出力されます。

概要

この記事では、HTTP モジュールと Request モジュールを使用して Node.js でファイルをダウンロードする方法を紹介します。これには、HTTP モジュールとリクエスト モジュールを使用したファイルのダウンロード、ダウンロードの進行状況の処理、およびファイル ダウンロード リンクのリダイレクトの処理に関する基本的な手順が含まれています。 Node.jsには非常に便利なファイルダウンロード機能が用意されており、ファイルのダウンロードを簡単に実装することができます。

以上がNodejsでファイルをダウンロードする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。