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データベースをインストールする方法を教えます

推薦する

CentOS 7.4 で MySQL 5.7.28 バイナリモードをインストールする方法

Linuxシステムバージョン: CentOS7.4 MySQL バージョン: 5.7.28 Linu...

Vueはタブを切り替えてデータの状態を維持する3つの方法を実装します

Vue でタブ切り替えを実装する 3 つの方法1. v-showはコンテンツの切り替えを制御します1...

MySQLの共通関数の概要

序文: MySQL データベースは、よく使用される集計関数、日付および文字列処理関数など、幅広い関数...

Dockerイメージを構築する2つの方法

目次既存のイメージからイメージを更新します。イメージを最初から構築する: Docker イメージ リ...

Linux での SELinux を理解する方法

目次1. SELinux の紹介2. SELinuxの基本概念2.1 仕事の種類2.2. セキュリテ...

Dockerでk8sをデプロイする方法

K8s k8s はクラスターです。クラスターには複数の名前空間があります。名前空間の下には複数のポッ...

MySQL インデックスの種類 (通常、ユニーク、フルテキスト) の説明

MySQL のインデックスの種類には、通常のインデックス、一意のインデックス、全文インデックスがあり...

Angularコンポーネントのライフサイクルの詳しい説明(パート2)

目次1. ビューフック1. ngAfterViewInit および ngAfterViewCheck...

Vue3 における非親子コンポーネントの値転送の詳細な説明

目次アプリ.vueサブ1.vueサブ2.vue要約する vue2 における非親子コンポーネントの値の...

MySQL の concat 関数についての簡単な説明。MySQL でフィールドの前または後に文字列を追加する方法

MySQL で concat 関数を使用する方法: CONCAT(文字列1、文字列2、…)戻り値は、...

Ubuntu 18.04にMySQL 5.7をインストールする

この記事は MySQL 公式サイトを参考にしてまとめたものであり、遭遇したいくつかの問題も記録されて...

MySql 8.0.16 バージョンのインストールでは、「UTF8B3」ではなく「UTF8B4」が使用されるように求められます。

MySQL 8.0.16 にインストールする場合、「UTF8B3」ではなく「UTF8B4」が使用さ...

CSS のマージンの崩壊問題を解決する方法

まず、マージン崩壊が発生する 3 つの状況を見てみましょう。 1. 隣接する 2 つのブロックレベル...

HTML ブロックレベルタグとインラインタグの違い

1. ブロックレベル要素: 独立して存在できる能力を指します。通常、ブロックレベル要素は改行によって...