首頁  >  文章  >  web前端  >  HTML5新特性之文件與二進位資料的操作

HTML5新特性之文件與二進位資料的操作

黄舟
黄舟原創
2017-03-30 13:02:352853瀏覽

歷史上,JavaScript無法處理二進位資料。如果一定要處理的話,只能使用charCodeAt()方法,一個個位元組地從文字編碼轉成二進位數據,還有一種辦法是將二進位資料轉成Base64編碼,再處理。引入了Blob對象,允許直接操作二進位資料。 API

,用來操作檔案。

FileList物件:File物件的網頁表單

介面
  • #FileReader物件:負責將二進位資料讀入記憶體

  • #URL物件:用於對二進位資料產生URL

  • #1、Blob物件
  • Blob(Binary Large

    Object
  • )物件代表了一段二進位數據,提供了一系列操作介面。 #屬性與方法
  • 。出一部分。個參數都不是必需的。點擊後提示下載文字檔hello-world.txt,檔案內容為"Hello World"。 。

  • #size:二進位資料的大小,單位為位元組。

type:二進位資料的MIME類型,全部為小寫,如果類型未知,則該值為空字串在Ajax操作中,若xhr.responseType設為blob,接收的就是二進位資料。

2、FileList物件FileList物件針對表單的File

控制項

。當使用者透過file控制項選取檔案後,這個控制項的files屬性值就是FileList物件。它在結構上類似於數組,包含使用者選取的多個檔案。

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;});

當使用者選取檔案後,就可以讀取該檔案。

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);

採用拖放方式,也可以得到FileList物件。

var newBlob = oldBlob.slice(startingByte, endindByte);

上面程式碼的handleFileSelect 是拖放

事件回呼函數

,它的參數evt是一個事件對象,該參數的dataTransfer .files屬性就是一個FileList對象,裡麵包含了拖放的檔案。

    3、File物件
  • File物件是FileList物件的成員,包含了檔案的一些元訊息,例如檔案名稱、上次改變時間、檔案大小和檔案類型。它的屬性值如下:

  • name:檔案名,該屬性只讀

  • size:檔案大小,單位為位元組,該屬性只讀

type:檔案的MIME類型,如果分辨不出類型,則為空字串,該屬性只讀。

lastModifiedDate:檔案的上次修改時間,此屬性只讀。

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);
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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn