久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      HTML5新特性之文件和二進(jìn)制數(shù)據(jù)的操作

      歷史上,JavaScript無法處理二進(jìn)制數(shù)據(jù)。如果一定要處理的話,只能使用charCodeAt()方法,一個個字節(jié)地從文字編碼轉(zhuǎn)成二進(jìn)制數(shù)據(jù),還有一種辦法是將二進(jìn)制數(shù)據(jù)轉(zhuǎn)成Base64編碼,再進(jìn)行處理。這兩種方法不僅速度慢,而且容易出錯。ECMAScript5引入了Blob對象,允許直接操作二進(jìn)制數(shù)據(jù)。

      Bolb對象是一個代表二進(jìn)制數(shù)據(jù)的基本對象,在它的基礎(chǔ)上,又衍生出一系列相關(guān)的API,用來操作文件。

      • File對象:負(fù)責(zé)處理那些以文件形式存在的二進(jìn)制數(shù)據(jù),也就是操作本地文件

      • FileList對象:File對象的網(wǎng)頁表單接口

      • FileReader對象:負(fù)責(zé)將二進(jìn)制數(shù)據(jù)讀入內(nèi)存

      • URL對象:用于對二進(jìn)制數(shù)據(jù)生成URL

      1、Blob對象

      Blob(Binary Large Object)對象代表了一段二進(jìn)制數(shù)據(jù),提供了一系列操作接口。其他操作二進(jìn)制數(shù)據(jù)的API(比如File對象),都是建立在Blob對象基礎(chǔ)上的,繼承了它的屬性和方法。

      生成Blob對象有兩種方法:一種是使用Blob構(gòu)造函數(shù),另一種是對現(xiàn)有的Blob對象使用slice方法切出一部分。

      (1)Blob構(gòu)造函數(shù),接受兩個參數(shù)。第一個參數(shù)是一個包含實際數(shù)據(jù)的數(shù)組,第二個參數(shù)是數(shù)據(jù)的類型,這兩個參數(shù)都不是必需的。

      var htmlParts = ['<a id="a"><b id="b">hey!</b></a>'];  var myBlob = new Blob(htmlParts, {'type': 'text/xml'});

      下面是一個利用Blob對象,生成可下載文件的例子。

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

      上面的代碼生成了一個超級鏈接,點擊后提示下載文本文件hello-world.txt,文件內(nèi)容為"Hello World"。

      (2) Blob對象的slice方法,將二進(jìn)制數(shù)據(jù)按照字節(jié)分塊,返回一個新的Blob對象。

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

      下面是一個使用XMLHttpRequest對象,將大文件分割上傳的例子。

      function upload(blobOrFile) {  var xhr = new XMLHttpRequest();    xhr.open('POST', '/server', true);    xhr.onload = function(e) { ... };    xhr.send(blobOrFile);  }    document.querySelector('input[type="file"]').addEventListener('change', 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);

      (3)Blob對象有兩個只讀屬性:

      • size:二進(jìn)制數(shù)據(jù)的大小,單位為字節(jié)。

      • type:二進(jìn)制數(shù)據(jù)的MIME類型,全部為小寫,如果類型未知,則該值為空字符串。

      在Ajax操作中,如果xhr.responseType設(shè)為blob,接收的就是二進(jìn)制數(shù)據(jù)。

      2、FileList對象

      FileList對象針對表單的File控件。當(dāng)用戶通過file控件選取文件后,這個控件的files屬性值就是FileList對象。它在結(jié)構(gòu)上類似于數(shù)組,包含用戶選取的多個文件。

      <input type="file" id="input" onchange="console.log(this.files.length)" multiple />

      當(dāng)用戶選取文件后,就可以讀取該文件。

      var selected_file = document.getElementById('input').files[0];

      采用拖放方式,也可以得到FileList對象。

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

      上面代碼的 handleFileSelect 是拖放事件的回調(diào)函數(shù),它的參數(shù)evt是一個事件對象,該參數(shù)的dataTransfer.files屬性就是一個FileList對象,里面包含了拖放的文件。

      3、File對象

      File對象是FileList對象的成員,包含了文件的一些元信息,比如文件名、上次改動時間、文件大小和文件類型。它的屬性值如下:

      • name:文件名,該屬性只讀

      • size:文件大小,單位為字節(jié),該屬性只讀

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

      • lastModifiedDate:文件的上次修改時間,該屬性只讀。

      var selected_file = document.getElementById('input').files[0];  var fileName = selected_file.name;  var fileSize = selected_file.size;  var fileType = selected_file.type;

      4、FileReader 對象

      FileReader對象接收File對象或Blob對象作為參數(shù),用于讀取文件的實際內(nèi)容,即把文件內(nèi)容讀入內(nèi)存。對于不同類型的文件,F(xiàn)ileReader使用不同的方法讀取。

      • FileReader.readAsBinaryString(Blob|File) :讀取結(jié)果為二進(jìn)制字符串,每個字節(jié)包含一個0到255之間的整數(shù)。

      • FileReader.readAsText(Blob|File, opt_encoding) :讀取結(jié)果是一個文本字符串。默認(rèn)情況下,文本編碼格式是'UTF-8',可以通過可選的格式參數(shù),指定其他編碼格式的文本。

      • FileReader.readAsDataURL(Blob|File) : 讀取結(jié)果是一個基于Base64編碼的 data-uri 對象。

      • FileReader.readAsArrayBuffer(Blob|File) :讀取結(jié)果是一個 ArrayBuffer 對象。

      FileReader采用異步方式讀取文件,可以為一系列事件指定回調(diào)函數(shù)。

      • onabort:讀取中斷或調(diào)用reader.abort()方法時觸發(fā)。

      • onerror:讀取出錯時觸發(fā)。

      • onload:讀取成功后觸發(fā)。

      • onloadend:讀取完成后觸發(fā),不管是否成功。觸發(fā)順序排在 onload 或 onerror 后面。

      • onloadstart:讀取將要開始時觸發(fā)。

      • onprogress:讀取過程中周期性觸發(fā)。

      下面的代碼是如何展示文本文件的內(nèi)容。

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

      onload事件的回調(diào)函數(shù)接受一個事件對象,該對象的target.result就是文件的內(nèi)容。

      下面是一個使用readAsDataURL方法,為img元素添加src屬性的例子。

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

      下面是一個onerror事件回調(diào)函數(shù)的例子。

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

      下面是一個onprogress事件回調(diào)函數(shù)的例子,主要用來顯示讀取進(jìn)度。

      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('.percent');              if (percentLoaded < 100) {          progress.style.width = percentLoaded + '%';          progress.textContent = percentLoaded + '%';        }      }  }

      讀取大文件的時候,可以利用Blob對象的slice方法,將大文件分成小段,逐一讀取,這樣可以加快處理速度。

      5、URL對象

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

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

      上面的代碼會對二進(jìn)制數(shù)據(jù)生成一個URL,類似于“blob:http%3A//test.com/666e6730-f45c-47c1-8012-ccc706f17191”。這個URL可以放置于任何通常可以放置URL的地方,比如img標(biāo)簽的src屬性。需要注意的是,即使是同樣的二進(jìn)制數(shù)據(jù),每調(diào)用一次URL.createObjectURL方法,就會得到一個不一樣的URL。

      這個URL的存在時間,等同于網(wǎng)頁的存在時間,一旦網(wǎng)頁刷新或卸載,這個URL就失效。除此之外,也可以手動調(diào)用URL.revokeObjectURL方法,使URL失效。

      window.URL.revokeObjectURL(objectURL);

      下面是一個利用URL對象,在網(wǎng)頁插入圖片的例子。

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

      還有一個本機視頻預(yù)覽的例子。

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

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號