JSのバイナリファミリーについての簡単な説明

JSのバイナリファミリーについての簡単な説明

概要

Blob: ファイル操作をサポートするために特に使用されるフロントエンド上のバイナリオブジェクト

ArrayBuffer: フロントエンドの汎用バイナリバッファ。配列に似ていますが、API と機能に多くの違いがあります。

バッファ: Node.js が提供するバイナリ バッファ。I/O 操作の処理によく使用されます。

ブロブ

まず、ファイル操作をサポートするために使用される Blob を紹介します。簡単に言うと、JS には File と Blob という 2 つのコンストラクターがあり、File は Blob のすべてのプロパティを継承します。

したがって、私たちの観点からすると、File オブジェクトは特別な Blob オブジェクトと見なすことができます。

フロントエンドエンジニアリングでは、どの操作で File オブジェクトを取得できますか? 参照:

(注: ファイル API 仕様の現在のステータスはワーキング ドラフトです)

上で述べたように、File オブジェクトは特別な Blob オブジェクトなので、当然 Blob オブジェクトのメソッドを直接呼び出すことができます。 Blobの具体的なメソッドと、それを使ってどのような機能を実現できるかを見てみましょう。

Blob の動作

BLOB は、window.URL.createObjectURL メソッドを通じて Blob URL に変換され、ファイルのダウンロードや画像の表示のリンクとして使用できます。

Blob URL によって実装されるダウンロード機能または表示機能は、単一のブラウザ内でのみ実行できます。サーバーに保存できない、またはサーバーに保存する意味がありません。

これはBlobの例です。非常に短いことがわかります。

ブロブ:d3958f5c-0777-0845-9dcf-2cb28783acaf

長い Base64 形式のデータ URL と比較すると、Blob URL の長さは十分な情報を保存するには明らかに不十分であり、これはブラウザ内の「参照」のようなものだということです。この観点から見ると、Blob URL はブラウザ自体によって開発された疑似プロトコルです。

BLOB ダウンロード ファイル

window.URL.createObjectURL を通じて Blob (ファイル) オブジェクトを受け取り、それを Blob URL に変換し、それを a.download プロパティに割り当てて、ページ上のこのリンクをクリックしてダウンロードすることができます。

<!-- html 部分 -->
<a id="h">ダウンロードするにはここをクリック</a>
<!-- js 部分 -->
<スクリプト>
  var blob = new Blob(["Hello World"]);
  var url = window.URL.createObjectURL(blob);
  var a = document.getElementById("h");
  a.download = "helloworld.txt";
  a.href = URL;
</スクリプト>

注意: ダウンロード属性は IE と互換性がありません。window.navigator.msSaveBlob メソッドまたはその他のメソッド (IE10/11) を通じて IE を最適化できます。

運用結果

ブロブ画像のローカル表示

window.URL.createObjectURL によって生成された Blob URL を img.src に割り当てて画像を表示することもできます。

<!-- html 部分 -->
<input type="file" id='f' />
<img id='img' スタイル="幅: 200px;高さ: 200px;" />
<!-- js 部分 -->
<スクリプト>
  document.getElementById('f').addEventListener('change', 関数(e) {
    var ファイル = this.files[0];
    定数img = document.getElementById('img');
    定数 url = window.URL.createObjectURL(ファイル);
    url = 画像ファイル
    img.onload = 関数(){
        // URL.createObjectURL を呼び出して以前に作成した URL オブジェクトを解放します。window.URL.revokeObjectURL(url);
    }
  }、 間違い);
</スクリプト>

運用結果

BLOBファイルのアップロード

  • Blob.slice(start,end) は大きな Blob を複数の小さな Blob に分割するために使用できます。
  • xhr.sendはBlobオブジェクトを直接送信できる

フロントエンド

<!-- html 部分 -->
<input type="file" id='f' />
<!-- js 部分 -->
<スクリプト>
  関数アップロード(blob) {
    var xhr = 新しい XMLHttpRequest();
    xhr.open('POST', '/ajax', true);
    xhr.setRequestHeader('コンテンツタイプ'、'text/plain')
    xhr.send(blob);
  }
  document.getElementById('f').addEventListener('change', 関数(e) {
    var blob = this.files[0];
    定数CHUNK_SIZE = 20; 。
    SIZE = blob.size;
    var 開始 = 0;
    var end = CHUNK_SIZE;
    (開始 < サイズ) {
        アップロード(blob.slice(開始、終了));
        開始 = 終了;
        終了 = 開始 + CHUNK_SIZE;
    }
  }、 間違い);
</スクリプト>

ノード

app.use(async (ctx, next) => {
    次の()を待ちます。
    ctx.path === '/ajax' の場合 {
        定数 req = ctx.req;
        const body = parse(req); を待機します。
        ctx.ステータス = 200;
        コンソールログ(本体);
        コンソールログ('---------------');
    }
});

ファイルの内容

湛江市商務局によると、今年1月から10月までに湛江市で実際に利用された外資は

運用結果

ファイルの内容をローカルで読み取る

Blobまたはファイルオブジェクトを読み取って他の形式のデータに変換したい場合は、FileReaderオブジェクトのAPIを使用して操作できます。

  • FileReader.readAsText(Blob): Blobをテキスト文字列に変換します
  • FileReader.readAsArrayBuffer(Blob): Blob を ArrayBuffer 形式のデータに変換します。
  • FileReader.readAsDataURL(): Blob を Base64 形式のデータ URL に変換します。

次に、ファイルの内容を文字列として読み取ってみます。

<input type="file" id='f' />


document.getElementById('f').addEventListener('change', 関数(e) {
    var ファイル = this.files[0];
    const リーダー = 新しい FileReader();
    reader.onload = 関数(){
        定数コンテンツ = reader.result;
        console.log(コンテンツ);
    }
    reader.readAsText(ファイル);
}、 間違い);

運用結果

以上はBlobの使い方を紹介しました。Blobがファイル用であることは簡単にわかります。つまり、ファイルオブジェクトであると言えます。同時に、Blobにはバイナリデータの詳細を操作する機能が欠けていることがわかります。たとえば、バイナリデータの一部を変更したい場合、Blobだけでは明らかに不十分です。このきめ細かい機能は、以下で紹介するArrayBufferによって完了できます。

配列バッファ

ArrayBuffer の一般的な機能を図で見てみましょう。

同時に、ArrayBufferはネイティブJS配列とは大きく異なることに注意する必要があります。図をご覧ください。

以下、一つずつ詳しく紹介します

ArrayBuffer形式でローカルデータを読み取る

document.getElementById('f').addEventListener('change', 関数(e) {
  ファイル = this.files[0];
  新しいFileReader()を作成します。
  fileReader.onload = 関数(){
    定数結果 = fileReader.result;
    console.log(結果)
  }
  fileReader.readAsArrayBuffer(ファイル);
}、 間違い);

運用結果

Ajax リクエストデータを ArrayBuffer 形式で読み取る

xhr.responseType = "arraybuffer" でレスポンスのデータ型を指定します。

onload コールバックで xhr.response を印刷する

フロントエンド

const xhr = 新しい XMLHttpRequest();
xhr.open("GET", "ajax", true);
xhr.responseType = "配列バッファ";
xhr.onload = 関数 () {
    コンソールログ(xhr.response)
}
xhr.send();

ノード

const app = new Koa();
app.use(async (ctx) => {
  if (パス名 = '/ajax') {
        ctx.body = 'こんにちは世界';
        ctx.ステータス = 200;
   }
}).listen(3000)

運用結果

TypeArray 経由で ArrayBuffer に書き込む

const typedArray1 = 新しい Int8Array(8);
型付き配列1[0] = 32;

const typedArray2 = 新しい Int8Array(typedArray1);
型付き配列2[1] = 42;
 
コンソールにログ出力します。
// 出力: Int8Array [32, 0, 0, 0, 0, 0, 0, 0]
 
コンソールにログ出力します。
// 出力: Int8Array [32, 42, 0, 0, 0, 0, 0, 0, 0]

DataView 経由で ArrayBuffer に書き込む

定数バッファ = 新しいArrayBuffer(16);
const view = 新しい DataView(バッファ);
ビュー.setInt8(2, 42);
コンソールログ(view.getInt8(2));
// 出力: 42

バッファ

Buffer は Node.js によって提供されるオブジェクトであり、フロントエンドでは使用できません。 一般的にはIO操作に使用されます。例えば、フロントエンドのリクエストデータを受信する場合、受信したフロントエンドデータを次のBuffer APIを通じて統合することができます。

バッファの動作

以下にいくつか例を挙げます。

ノード側(Koa)

const app = new Koa();
app.use(async (ctx, next) => {
    ctx.path === '/ajax' の場合 {
        const チャンク = [];
        定数 req = ctx.req;
        req.on('データ', buf => {
            chunks.push(buf);
        })
        req.on('end', () => {
            buffer = Buffer.concat(チャンク) とします。
            コンソールログ(バッファ.toString())
        })
    }
});
アプリを聴く(3000)

フロントエンド

const xhr = 新しい XMLHttpRequest();
xhr.open("POST", "ajax", true);
xhr.setRequestHeader('コンテンツタイプ'、'text/plain')
xhr.send("asdasdsadfsdfsadasdas");

運用結果

ノード出力

asdasdsadfsdfsadasdas

上記は、JS のバイナリ ファミリの詳細についての簡単な説明です。JS のバイナリ ファミリの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • JavaScript に基づくバイナリ画像ストリームの処理プロセスの詳細な説明
  • node.JS バイナリ操作モジュールにおけるバッファオブジェクトの使用方法の詳細な説明
  • Node.jsバイナリとBufferの紹介と使用
  • JS文字列とバイナリ間の相互変換の詳細なコード例
  • Node.js Windows バイナリのインストール方法
  • JavaScript でバイナリデータを読み書きする方法の詳細な説明
  • js バイナリデータ操作方法
  • nodeJSバイナリバッファオブジェクトの詳細な説明
  • jsはbase64でエンコードされたバイナリストリームのWebページ画像を表示します
  • JavaScript バイナリ演算スキルの分析

<<:  Tomcat パイプライン モードのパイプラインとバルブの詳細な説明

>>:  MacにMySQLデータベースをインストールする方法を教えます

推薦する

TypeScript とは何ですか?

目次1. JavaScriptの問題2. TypeScriptの利点3. TypeScriptの欠点...

ベスト HTML/CSS デザインおよび開発フレームワーク 15 選を紹介します

プロフェッショナルな Web デザインは複雑で時間がかかります。 HTML と CSS フレームワー...

ウェブサイトのパフォーマンスを向上させるためのウェブサーバーの改善

<br />このシリーズの最初のセクションでは、Web サイトのパフォーマンスを向上させ...

Dockerコンテナを停止および削除できない問題の解決策

実行中のコンテナIDを見つける ドッカーps上記のコンテナの物理的な場所を見つける /var/lib...

DockerでMongoDBコンテナをデプロイする方法

目次Dockerとは展開する1. イメージをプルする2. 画像を表示する3. コンテナを実行する4....

CSSスクロールバーのスタイルをカスタマイズする方法の詳細な説明

この記事では、CSS スクロールバー セレクターを紹介し、Webkit ブラウザーと IE ブラウザ...

MySQL シリーズ: redo ログ、undo ログ、binlog の詳細な説明

取引の実施REDO ログはトランザクションの永続性を保証し、UNDO ログはトランザクションのロール...

MyBatis 動的 SQL の包括的な説明

目次序文動的SQL 1. まずモジュールのディレクトリ構造を見てみましょう2. 物理モデリングと論理...

異なるインデックスを更新してMySQLのデッドロックルーチンを解決する

前回の記事では、ソース コードを使用してロック関連の情報をデバッグする方法を紹介しました。ここでは、...

Linux システムのデュアル ネットワーク カード バインディング構成の実装

システムバージョン [root@ ~]# cat /etc/redhat-release CentO...

Linux userdel コマンドの使用法

1. コマンドの紹介userdel (ユーザー削除) コマンドは、ユーザー アカウントと関連ファイル...

Ubuntu 18.04 に Nvidia グラフィック カード ドライバーをインストールするチュートリアル (画像とテキスト付き)

0. 事前準備BIOS でセキュア ブートを無効にします。無効にしないと、サードパーティ ソースを...

HTML要素にフォーカスを設定する方法

コードをコピーコードは次のとおりです。 <本文<フォームアクション="&quo...

CSS で写真のスタッキング効果を実装するサンプルコード

成果を達成するステップ1. 初期index.html最初の写真、一番上の写真を作成します。写真の i...

CSS3 グラデーション背景の互換性の問題

グラデーションの背景色を作成するときは、 linear-gradient() 関数を使用して線形グラ...