ホームページ  >  記事  >  ウェブフロントエンド  >  HTML5 の新機能: ファイルおよびバイナリ データの操作

HTML5 の新機能: ファイルおよびバイナリ データの操作

黄舟
黄舟オリジナル
2017-03-30 13:02:352792ブラウズ

歴史的に、JavaScript はバイナリ データを処理できません。処理する必要がある場合は、charCodeAt() メソッドのみを使用できます。 a テキスト エンコーディングをバイト単位でバイナリ データに変換する方法と、バイナリ データを Base64 エンコーディングに変換してから処理する方法です。これら 2 つの方法では時間がかかるだけでなく、エラーが発生しやすくなります。 Bolb オブジェクトはバイナリデータを表す基本的なオブジェクトであり、それに基づいてファイルを操作するために使用される一連の

API

が生成されます。ファイルの形式で存在するバイナリ データを処理します。つまり、ローカル ファイルを操作します。

    FileList オブジェクト: Web フォーム
  • File オブジェクトのインターフェイス

  • FileReader オブジェクト: バイナリ データをメモリに読み取る責任があります
  • URL オブジェクト: バイナリ データ

  • 1 の URL を生成するために使用されます。Blob オブジェクト

  • Blob (Binary Large
  • Object

    ) オブジェクトは、バイナリ データの一部を表し、バイナリ データに対する一連の他の操作インターフェイス (次のような) を提供します。ファイル オブジェクト)) はすべて Blob オブジェクト上に構築され、

    その
  • プロパティとメソッド
を継承します

Blob オブジェクトを生成するには 2 つの方法があります。1 つは Blob

コンストラクター を使用する方法です。 Blob オブジェクトを作成します。一部の Blob オブジェクトはスライス メソッドを使用してパーツを切り出します。(1) Blob コンストラクターは 2 つのパラメーターを受け取り、実際のデータを含みます。2 番目のパラメーターは型です。データのパラメータはどれも必要ありません。

var htmlParts = [&#39;<a id="a"><b id="b">hey!<\/b><\/a>&#39;];
var myBlob = new Blob(htmlParts, {&#39;type&#39;: &#39;text\/xml&#39;});
次は、Blob オブジェクトを使用してダウンロード可能なファイルを生成する例です。

var blob = new Blob([&#39;Hello World&#39;]);var a = document.createElement(&#39;a&#39;);
a.href = window.URL.createObjectURL(blob);
a.donwload = &#39;hello-world.txt&#39;;
a.textContent = &#39;Download Hello World&#39;;

body.appendChild(a);

テキスト ファイルのダウンロードを求めるハイパーリンクを生成します。 -world.txt をクリックすると、ファイルの内容は「Hello World」になります。(2) Blob オブジェクトのスライスメソッドは、バイナリデータをバイトに分割して、新しい Blob オブジェクトを返します。 XMLHttpRequest オブジェクトを使用して大きなファイルを分割するメソッド

アップロードの例

var newBlob = oldBlob.slice(startingByte, endindByte);
(3) Blob オブジェクトには 2 つの読み取り専用属性があります:

size: バイナリ データのサイズ (バイト単位)。

type: バイナリデータの MIME タイプ、すべて小文字、タイプが不明な場合、値は空の

Ajax 操作では、xhr.responseType が blob に設定されている場合、受信データ2. フォームの FileList オブジェクト

FileList オブジェクトです。ユーザーがファイル コントロールを通じてファイルを選択すると、このコントロールの files 属性の値は FileList オブジェクトになります。これは構造が配列に似ており、ユーザーが選択した複数のファイルが含まれています。

function upload(blobOrFile) {  var xhr = new XMLHttpRequest();
  xhr.open(&#39;POST&#39;, &#39;/server&#39;, true);
  xhr.onload = function(e) { ... };
  xhr.send(blobOrFile);
}

document.querySelector(&#39;input[type="file"]&#39;).addEventListener(&#39;change&#39;, function(e) {  
var blob = this.files[0];  
var BYTES_PER_CHUNK = 1024 * 1024; // 1MB chunk sizes.
  var SIZE = blob.size;  var start = 0;  
  var end = BYTES_PER_CHUNK;  while(start < SIZE) {
    upload(blob.slice(start, end));

    start = end;
    end = start + BYTES_PER_CHUNK;
  }
}, false);
  • ユーザーがファイルを選択すると、ファイルを読み取ることができます。

    <input type="file" id="input" onchange="console.log(this.files.length)" multiple />
  • ドラッグアンドドロップメソッドを使用して、FileList オブジェクトを取得することもできます。

    var selected_file = document.getElementById(&#39;input&#39;).files[0];

    上記のコードの handleFileSelect は、ドラッグ アンド ドロップ イベント
コールバック関数

であり、そのパラメーター evt はイベント オブジェクトであり、このパラメーターの dataTransfer.files プロパティは、ファイルをドラッグ アンド ドロップしました。

3. File オブジェクト

File オブジェクトは FileList オブジェクトのメンバーであり、ファイル名、最終変更時刻、ファイル サイズ、ファイル タイプなどのファイルに関するメタ情報が含まれています。その属性値は次のとおりです:

name: ファイル名、この属性は読み取り専用です

size: ファイル サイズ、バイト単位、この属性は読み取り専用です

type: MIME タイプ解決された場合、ファイルのタイプが指定されていない場合、空の文字列となり、このプロパティは読み取り専用になります。 lastModifiedDate: ファイルの最終変更時刻。この属性は読み取り専用です。

var dropZone = document.getElementById(&#39;drop_zone&#39;);
dropZone.addEventListener(&#39;drop&#39;, handleFileSelect, false);
function handleFileSelect(evt) {
    evt.stopPropagation();
    evt.preventDefault();    
    var files = evt.dataTransfer.files; // FileList object.

    // ...}

4. FileReader オブジェクト

FileReader オブジェクトは、File オブジェクトまたは Blob オブジェクトをパラメーターとして受け取り、
    ファイルの実際の内容を読み取る
  • 、つまりファイルの内容をメモリに読み取るために使用されます。ファイルの種類が異なると、FileReader は異なるメソッドを使用して読み取ります。

    • FileReader.readAsBinaryString(Blob|File) :读取结果为二进制字符串,每个字节包含一个0到255之间的整数

    • FileReader.readAsText(Blob|File, opt_encoding) :读取结果是一个文本字符串。默认情况下,文本编码格式是'UTF-8',可以通过可选的格式参数,指定其他编码格式的文本。

    • FileReader.readAsDataURL(Blob|File) : 读取结果是一个基于Base64编码的 data-uri 对象。

    • FileReader.readAsArrayBuffer(Blob|File) :读取结果是一个 ArrayBuffer 对象。

    FileReader采用异步方式读取文件,可以为一系列事件指定回调函数。

    • onabort:读取中断或调用reader.abort()方法时触发。

    • onerror:读取出错时触发。

    • onload:读取成功后触发。

    • onloadend:读取完成后触发,不管是否成功。触发顺序排在 onload 或 onerror 后面。

    • onloadstart:读取将要开始时触发。

    • onprogress:读取过程中周期性触发。

    下面的代码是如何展示文本文件的内容。

    var reader = new FileReader();
    
    reader.onload = function(e){
           console.log(e.target.result);
    }
    
    reader.readAsText(blob);

    onload事件的回调函数接受一个事件对象,该对象的target.result就是文件的内容。

    下面是一个使用readAsDataURL方法,为img元素添加src属性的例子。

    var reader = new FileReader();
    
    reader.onload = function(e) {
        document.createElement(&#39;img&#39;).src = e.target.result;
    
    };
    
    reader.readAsDataURL(f);

    下面是一个onerror事件回调函数的例子。

    var reader = new FileReader();
    reader.onerror = errorHandler;
    function errorHandler(evt) {    
    switch(evt.target.error.code) {      
    case evt.target.error.NOT_FOUND_ERR:
            alert(&#39;File Not Found!&#39;);        
            break;      
            case evt.target.error.NOT_READABLE_ERR:
            alert(&#39;File is not readable&#39;);        
            break;      
            case evt.target.error.ABORT_ERR:        
            break;      
            default:
            alert(&#39;An error occurred reading this file.&#39;);
        };
    }

    下面是一个onprogress事件回调函数的例子,主要用来显示读取进度。

    var reader = new FileReader();
    reader.onprogress = updateProgress;function updateProgress(evt) {    
    if (evt.lengthComputable) {      
    var percentLoaded = Math.round((evt.loaded / evt.totalEric Bidelman) * 100);      
          var progress = document.querySelector(&#39;.percent&#39;);      
          if (percentLoaded < 100) {
            progress.style.width = percentLoaded + &#39;%&#39;;
            progress.textContent = percentLoaded + &#39;%&#39;;
          }
        }
    }

    读取大文件的时候,可以利用Blob对象的slice方法,将大文件分成小段,逐一读取,这样可以加快处理速度。

    5、URL对象

    URL对象用于生成指向File对象或Blob对象的URL。 

    var objecturl =  window.URL.createObjectURL(blob);

    上面的代码会对二进制数据生成一个URL,类似于“blob:http%3A//test.com/666e6730-f45c-47c1-8012-ccc706f17191”。这个URL可以放置于任何通常可以放置URL的地方,比如img标签的src属性。需要注意的是,即使是同样的二进制数据,每调用一次URL.createObjectURL方法,就会得到一个不一样的URL。

    这个URL的存在时间,等同于网页的存在时间,一旦网页刷新或卸载,这个URL就失效。除此之外,也可以手动调用URL.revokeObjectURL方法,使URL失效。

    window.URL.revokeObjectURL(objectURL);

    下面是一个利用URL对象,在网页插入图片的例子。

    var img = document.createElement("img");
    
    img.src = window.URL.createObjectURL(files[0]);
    
    img.height = 60;
    
    img.onload = function(e) {
        window.URL.revokeObjectURL(this.src);
    }
    
    body.appendChild(img);var info = document.createElement("span");
    
    info.innerHTML = files[i].name + ": " + files[i].size + " bytes";
    
    body.appendChild(info);

    还有一个本机视频预览的例子。

    var video = document.getElementById(&#39;video&#39;);var obj_url = window.URL.createObjectURL(blob);
    video.src = obj_url;
    video.play()
    window.URL.revokeObjectURL(obj_url);

以上がHTML5 の新機能: ファイルおよびバイナリ データの操作の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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