ホームページ ウェブフロントエンド jsチュートリアル Nodejs に基づいて大きなファイルの HTTP 転送を実装するにはどうすればよいですか? (実践方法の共有)

Nodejs に基づいて大きなファイルの HTTP 転送を実装するにはどうすればよいですか? (実践方法の共有)

Jan 17, 2022 pm 07:16 PM
http nodejs ファイルを転送する

ベース node大きなファイルの http 送信を実装するにはどうすればよいですか?次の記事では、nodejs をベースにしたいくつかの実用的な http ファイル転送ソリューションを紹介します。

Nodejs に基づいて大きなファイルの HTTP 転送を実装するにはどうすればよいですか? (実践方法の共有)

nodejs に基づく http ファイル転送ソリューションは、現在のフロントエンドおよびバックエンドのフルスタック開発において重要な役割を果たしています。この記事では、大きなファイルの HTTP 転送を実装するためのいくつかのソリューションについて説明します。関数を実装する前に、まず、nodejs の fs モジュールを通じて大きなファイルを書き込み、プロジェクト内にローカル ファイルを生成します。

const fs = require('fs');
const writeStream = fs.createWriteStream(__dirname + "/file.txt");
for(let i = 0;i <= 100000; i++) {
  writeStream.write(`${i} —— 我是${i}号文件\n`, "utf-8");
}
writeStream.end();
ログイン後にコピー

Nodejs に基づいて大きなファイルの HTTP 転送を実装するにはどうすればよいですか? (実践方法の共有)

上記のコードが正常に実行された後、Aサイズ 3.2MB のテキスト ファイルが現在の実行ディレクトリに生成され、次のプログラムの「大きなファイル素材」として使用されます。大きなファイルの転送スキームをリストする前に、まず、後で使用する 2 つのパブリック メソッド、ファイル読み取りメソッドファイル圧縮メソッド:

// 封装读取文件的方法
const readFile = async (paramsData) => {
  return new Promise((resolve, reject) => {
    fs.readFile(paramsData, (err, data) => {
      if(err) {
        reject(&#39;文件读取错误&#39;);
      } else {
        resolve(data);
      }
    })
  })
}

// 封装文件压缩方法
const gzip = async (paramsData) => {
  return new Promise((resolve, reject) => {
    zlib.gzip(paramsData, (err, result) => {
      if(err) {
        reject(&#39;文件压缩错误&#39;);
      } else {
        resolve(result);
      }
    })
  })
}
ログイン後にコピー

## をカプセル化します。 #1. データ圧縮後に大きなファイルを送信する

ブラウザがリクエストを送信すると、

acceptaccept-*# が送信されます。 ## リクエスト ヘッダー情報。現在のブラウザでサポートされているファイル タイプ、サポートされている圧縮形式のリスト、およびサポートされている言語をサーバーに伝えるために使用されます。リクエスト ヘッダーの Accept-Encoding フィールドは、クライアントが理解できるコンテンツ エンコード方式 (通常は特定の圧縮アルゴリズム) をサーバーに伝えるために使用されます。サーバーはクライアントによってサポートされているメソッドを選択し、応答ヘッダー Content-Encoding を通じてその選択をクライアントに通知します。応答ヘッダーは、返された JS スクリプトが gzip## に渡されることをブラウザーに伝えます。 # 処理された圧縮アルゴリズム

// 请求头
accept-encoding: gzip, deflate, br
ログイン後にコピー
// 响应头
cache-control: max-age=2592000 
content-encoding: gzip 
content-type: application/x-javascript
ログイン後にコピー
Accept-Encoding

フィールドと

Content-Encoding フィールドの理解に基づいて、それがオンになっていないことを確認しましょう gzip そして gzip をオンにした場合の効果。

// 实现一个简单的文件读取服务器(没有开启gzip)
const server = http.createServer(async (req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
  });
  const buffer = await readFile(__dirname + &#39;/file.txt&#39;);
  res.write(buffer);
  res.end();
})
server.listen(3000, () => {
  console.log(`server启动成功`)
})
ログイン後にコピー

// 实现一个简单的文件读取服务器(开启gzip)
const server = http.createServer(async(req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
    "Content-Encoding": "gzip"
  });
  const buffer = await readFile(__dirname + &#39;/file.txt&#39;);
  const gzipData = await gzip(buffer);
  res.write(gzipData);
  res.end();
})
server.listen(3000, () => {
  console.log(`server启动成功`)
})
ログイン後にコピー

Nodejs に基づいて大きなファイルの HTTP 転送を実装するにはどうすればよいですか? (実践方法の共有)

Nodejs に基づいて大きなファイルの HTTP 転送を実装するにはどうすればよいですか? (実践方法の共有)

2. データ チャンクによる送信

データベース クエリから取得したデータを使用して大規模な HTML テーブルを生成する必要があるシナリオ、または大量の画像を送信する必要がある場合、これはブロック送信によって実現できます。

Transfer-Encoding: chunked
Transfer-Encoding: gzip, chunked
ログイン後にコピー

応答ヘッダーの

Transfer-Encoding

フィールドの値は

chunked で、データが一連のチャンクで送信されることを示します。 2 つのフィールド Transfer-EncodingContent-Length は相互に排他的であることに注意してください。つまり、これら 2 つのフィールドは応答メッセージ内に同時に出現することはできません。

// 数据分块传输
const spilitChunks = async () =>{
  const buffer = await readFile(__dirname + &#39;/file.txt&#39;);
  const lines = buffer.toString(&#39;utf-8&#39;).split(&#39;\n&#39;);
  let [chunks, i, n] = [[], 0, lines.length];
  while(i < n) {
    chunks.push(lines.slice(i, i+= 10));
  };
  return chunks;
}
const server = http.createServer(async(req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
    "Transfer-Encoding": "chunked",
    "Access-Control-Allow-Origin": "*",
  });
  const chunks = await spilitChunks();
  for(let i =0; i< chunks.length; i++) {
    setTimeout(() => {
      let content = chunks[i].join("&");
      res.write(`${content.length.toString(16)}\r\n${content}\r\n`);
    }, i * 1000);
  }
  setTimeout(() => {
    res.end();
  }, chunks.length * 1000);
})
server.listen(3000, () => {
  console.log(`server启动成功`)
})
ログイン後にコピー

3. データ ストリーム経由で送信

Node.js

を使用する場合 大きなファイルをクライアントに返す を使用する場合ストリームを使用してファイル ストリームを返すと、大きなファイルを処理するときに大量のメモリを消費することを避けることができます。具体的な実装は以下の通りです。ストリーム形式を使用してファイル データを返す場合、HTTP 応答ヘッダーの

Transfer-Encoding フィールドの値は chunked となり、データが一連のチャンクで送信されることを示します。

const server = http.createServer((req, res) => {
  res.writeHead(200, {
    "Content-Type": "text/plain;charset=utf-8",
    "Content-Encoding": "gzip",
    "Transfer-Encoding": "chunked"
  });
  fs.createReadStream(__dirname + "/file.txt")
    .setEncoding("utf-8")
    .pipe(zlib.createGzip())
    .pipe(res);
})

server.listen(3000, () => {
  console.log(`server启动成功`)
})
ログイン後にコピー
ノード関連の知識については、nodejs チュートリアル を参照してください。 !

以上がNodejs に基づいて大きなファイルの HTTP 転送を実装するにはどうすればよいですか? (実践方法の共有)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Nodejs はバックエンド フレームワークですか? Nodejs はバックエンド フレームワークですか? Apr 21, 2024 am 05:09 AM

Node.js は、高いパフォーマンス、スケーラビリティ、クロスプラットフォーム サポート、豊富なエコシステム、開発の容易さなどの機能を備えているため、バックエンド フレームワークとして使用できます。

Nodejsをmysqlデータベースに接続する方法 Nodejsをmysqlデータベースに接続する方法 Apr 21, 2024 am 06:13 AM

MySQL データベースに接続するには、次の手順に従う必要があります。 mysql2 ドライバーをインストールします。 mysql2.createConnection() を使用して、ホスト アドレス、ポート、ユーザー名、パスワード、データベース名を含む接続オブジェクトを作成します。 connection.query() を使用してクエリを実行します。最後に connection.end() を使用して接続を終了します。

Nodejsのグローバル変数とは何ですか Nodejsのグローバル変数とは何ですか Apr 21, 2024 am 04:54 AM

Node.js には次のグローバル変数が存在します。 グローバル オブジェクト: グローバル コア モジュール: プロセス、コンソール、require ランタイム環境変数: __dirname、__filename、__line、__column 定数: unknown、null、NaN、Infinity、-Infinity

Nodejs インストール ディレクトリ内の npm ファイルと npm.cmd ファイルの違いは何ですか? Nodejs インストール ディレクトリ内の npm ファイルと npm.cmd ファイルの違いは何ですか? Apr 21, 2024 am 05:18 AM

Node.js インストール ディレクトリには、npm と npm.cmd という 2 つの npm 関連ファイルがあります。違いは次のとおりです。拡張子が異なります。npm は実行可能ファイルで、npm.cmd はコマンド ウィンドウのショートカットです。 Windows ユーザー: npm.cmd はコマンド プロンプトから使用できますが、npm はコマンド ラインからのみ実行できます。互換性: npm.cmd は Windows システムに固有ですが、npm はクロスプラットフォームで使用できます。使用上の推奨事項: Windows ユーザーは npm.cmd を使用し、他のオペレーティング システムは npm を使用します。

NodejsとJavaの間に大きな違いはありますか? NodejsとJavaの間に大きな違いはありますか? Apr 21, 2024 am 06:12 AM

Node.js と Java の主な違いは、設計と機能です。 イベント駆動型とスレッド駆動型: Node.js はイベント駆動型で、Java はスレッド駆動型です。シングルスレッドとマルチスレッド: Node.js はシングルスレッドのイベント ループを使用し、Java はマルチスレッド アーキテクチャを使用します。ランタイム環境: Node.js は V8 JavaScript エンジン上で実行され、Java は JVM 上で実行されます。構文: Node.js は JavaScript 構文を使用し、Java は Java 構文を使用します。目的: Node.js は I/O 集中型のタスクに適しており、Java は大規模なエンタープライズ アプリケーションに適しています。

Nodejs はバックエンド開発言語ですか? Nodejs はバックエンド開発言語ですか? Apr 21, 2024 am 05:09 AM

はい、Node.js はバックエンド開発言語です。これは、サーバー側のビジネス ロジックの処理、データベース接続の管理、API の提供などのバックエンド開発に使用されます。

Nodejsプロジェクトをサーバーにデプロイする方法 Nodejsプロジェクトをサーバーにデプロイする方法 Apr 21, 2024 am 04:40 AM

Node.js プロジェクトのサーバー デプロイメント手順: デプロイメント環境を準備します。サーバー アクセスの取得、Node.js のインストール、Git リポジトリのセットアップ。アプリケーションをビルドする: npm run build を使用して、デプロイ可能なコードと依存関係を生成します。コードをサーバーにアップロードします: Git またはファイル転送プロトコル経由。依存関係をインストールする: サーバーに SSH で接続し、npm install を使用してアプリケーションの依存関係をインストールします。アプリケーションを開始します。node Index.js などのコマンドを使用してアプリケーションを開始するか、pm2 などのプロセス マネージャーを使用します。リバース プロキシの構成 (オプション): Nginx や Apache などのリバース プロキシを使用して、トラフィックをアプリケーションにルーティングします。

NodejsとJavaのどちらを選択しますか? NodejsとJavaのどちらを選択しますか? Apr 21, 2024 am 04:40 AM

Web 開発において Node.js と Java にはそれぞれ長所と短所があり、どちらを選択するかはプロジェクトの要件によって異なります。 Node.js はリアルタイム アプリケーション、迅速な開発、マイクロサービス アーキテクチャに優れており、Java はエンタープライズ グレードのサポート、パフォーマンス、セキュリティに優れています。

See all articles