# ArrayBuffer 对象ï¼Blob 对象 ## ArrayBuffer 对象 ArrayBuffer å¯¹è±¡è¡¨ç¤ºä¸æ®µäºè¿å¶æ°æ®ï¼ç¨æ¥æ¨¡æå åéé¢çæ°æ®ãéè¿è¿ä¸ªå¯¹è±¡ï¼JavaScript å¯ä»¥è¯»åäºè¿å¶æ°æ®ãè¿ä¸ªå¯¹è±¡å¯ä»¥çä½å åæ°æ®ç表达ã è¿ä¸ªå¯¹è±¡æ¯ ES6 æåå ¥æ åçï¼æ®éçç½é¡µç¼ç¨ç¨ä¸å°å®ï¼ä¸ºäºæç¨ä½ç³»ç宿´ï¼ä¸é¢åªæä¾ä¸ä¸ªç®ç¥çä»ç»ï¼è¯¦ç»ä»ç»è¯·çãES6 æ åå ¥é¨ãéé¢çç« èã æµè§å¨åçæä¾`ArrayBuffer()`æé 彿°ï¼ç¨æ¥çæå®ä¾ã宿¥åä¸ä¸ªæ´æ°ä½ä¸ºåæ°ï¼è¡¨ç¤ºè¿æ®µäºè¿å¶æ°æ®å ç¨å¤å°ä¸ªåèã ```javascript var buffer = new ArrayBuffer(8); ``` ä¸é¢ä»£ç ä¸ï¼å®ä¾å¯¹è±¡`buffer`å ç¨8个åèã ArrayBuffer 对象æå®ä¾å±æ§`byteLength`ï¼è¡¨ç¤ºå½åå®ä¾å ç¨çå åé¿åº¦ï¼åä½åèï¼ã ```javascript var buffer = new ArrayBuffer(8); buffer.byteLength // 8 ``` ArrayBuffer 对象æå®ä¾æ¹æ³`slice()`ï¼ç¨æ¥å¤å¶ä¸é¨åå åã宿¥åä¸¤ä¸ªæ´æ°åæ°ï¼åå«è¡¨ç¤ºå¤å¶çå¼å§ä½ç½®ï¼ä»0å¼å§ï¼åç»æä½ç½®ï¼å¤å¶æ¶ä¸å æ¬ç»æä½ç½®ï¼ï¼å¦æçç¥ç¬¬äºä¸ªåæ°ï¼å表示ä¸ç´å¤å¶å°ç»æã ```javascript var buf1 = new ArrayBuffer(8); var buf2 = buf1.slice(0); ``` ä¸é¢ä»£ç 表示å¤å¶åæ¥çå®ä¾ã ## Blob 对象 ### ç®ä» Blob 对象表示ä¸ä¸ªäºè¿å¶æä»¶çæ°æ®å å®¹ï¼æ¯å¦ä¸ä¸ªå¾çæä»¶çå 容就å¯ä»¥éè¿ Blob 对象读åãå®éå¸¸ç¨æ¥è¯»åæä»¶ï¼å®çå忝 Binary Large Object ï¼äºè¿å¶å¤§å对象ï¼ç缩åãå®ä¸ ArrayBuffer çåºå«å¨äºï¼å®ç¨äºæä½äºè¿å¶æä»¶ï¼è ArrayBuffer ç¨äºæä½å åã æµè§å¨åçæä¾`Blob()`æé 彿°ï¼ç¨æ¥çæå®ä¾å¯¹è±¡ã ```javascript new Blob(array [, options]) ``` `Blob`æé 彿°æ¥åä¸¤ä¸ªåæ°ã第ä¸ä¸ªåæ°æ¯æ°ç»ï¼æåæ¯å符串æäºè¿å¶å¯¹è±¡ï¼è¡¨ç¤ºæ°çæç`Blob`å®ä¾å¯¹è±¡çå 容ï¼ç¬¬äºä¸ªåæ°æ¯å¯éçï¼æ¯ä¸ä¸ªé 置对象ï¼ç®ååªæä¸ä¸ªå±æ§`type`ï¼å®ç弿¯ä¸ä¸ªå符串ï¼è¡¨ç¤ºæ°æ®ç MIME ç±»åï¼é»è®¤æ¯ç©ºå符串ã ```javascript var htmlFragment = ['hey!']; var myBlob = new Blob(htmlFragment, {type : 'text/html'}); ``` ä¸é¢ä»£ç ä¸ï¼å®ä¾å¯¹è±¡`myBlob`å å«çæ¯å符串ãçæå®ä¾çæ¶åï¼æ°æ®ç±»åæå®ä¸º`text/html`ã ä¸é¢æ¯å¦ä¸ä¸ªä¾åï¼Blob ä¿å JSON æ°æ®ã ```javascript var obj = { hello: 'world' }; var blob = new Blob([ JSON.stringify(obj) ], {type : 'application/json'}); ``` ### å®ä¾å±æ§åå®ä¾æ¹æ³ `Blob`å ·æä¸¤ä¸ªå®ä¾å±æ§`size`å`type`ï¼åå«è¿åæ°æ®ç大å°åç±»åã ```javascript var htmlFragment = ['hey!']; var myBlob = new Blob(htmlFragment, {type : 'text/html'}); myBlob.size // 32 myBlob.type // "text/html" ``` `Blob`å ·æä¸ä¸ªå®ä¾æ¹æ³`slice`ï¼ç¨æ¥æ·è´åæ¥çæ°æ®ï¼è¿åç乿¯ä¸ä¸ª`Blob`å®ä¾ã ```javascript myBlob.slice(startï¼end, contentType) ``` `slice`æ¹æ³æä¸ä¸ªåæ°ï¼é½æ¯å¯éçãå®ä»¬ä¾æ¬¡æ¯èµ·å§çåèä½ç½®ï¼é»è®¤ä¸º0ï¼ãç»æçåèä½ç½®ï¼é»è®¤ä¸º`size`屿§çå¼ï¼è¯¥ä½ç½®æ¬èº«å°ä¸å å«å¨æ·è´çæ°æ®ä¹ä¸ï¼ãæ°å®ä¾çæ°æ®ç±»åï¼é»è®¤ä¸ºç©ºå符串ï¼ã ### è·åæä»¶ä¿¡æ¯ æä»¶éæ©å¨``ç¨æ¥è®©ç¨æ·éåæä»¶ãåºäºå®å ¨èèï¼æµè§å¨ä¸å è®¸èæ¬èªè¡è®¾ç½®è¿ä¸ªæ§ä»¶ç`value`屿§ï¼å³æä»¶å¿ é¡»æ¯ç¨æ·æå¨éåçï¼ä¸è½æ¯èæ¬æå®çã䏿¦ç¨æ·éå¥½äºæä»¶ï¼èæ¬å°±å¯ä»¥è¯»åè¿ä¸ªæä»¶ã æä»¶éæ©å¨è¿åä¸ä¸ª FileList 对象ï¼è¯¥å¯¹è±¡æ¯ä¸ä¸ªç±»ä¼¼æ°ç»çæåï¼æ¯ä¸ªæå齿¯ä¸ä¸ª File å®ä¾å¯¹è±¡ãFile å®ä¾å¯¹è±¡æ¯ä¸ä¸ªç¹æ®ç Blob å®ä¾ï¼å¢å äº`name`å`lastModifiedDate`屿§ã ```javascript // HTML 代ç å¦ä¸ // function fileinfo(files) { for (var i = 0; i < files.length; i++) { var f = files[i]; console.log( f.name, // æä»¶åï¼ä¸å«è·¯å¾ f.size, // æä»¶å¤§å°ï¼Blob å®ä¾å±æ§ f.type, // æä»¶ç±»åï¼Blob å®ä¾å±æ§ f.lastModifiedDate // æä»¶çæåä¿®æ¹æ¶é´ ); } } ``` é¤äºæä»¶éæ©å¨ï¼ææ¾ API ç`dataTransfer.files`è¿åç乿¯ä¸ä¸ªFileList 对象ï¼å®çæåå æ¤ä¹æ¯ File å®ä¾å¯¹è±¡ã ### ä¸è½½æä»¶ AJAX è¯·æ±æ¶ï¼å¦ææå®`responseType`屿§ä¸º`blob`ï¼ä¸è½½ä¸æ¥çå°±æ¯ä¸ä¸ª Blob 对象ã ```javascript function getBlob(url, callback) { var xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.responseType = 'blob'; xhr.onload = function () { callback(xhr.response); } xhr.send(null); } ``` ä¸é¢ä»£ç ä¸ï¼`xhr.response`æ¿å°çå°±æ¯ä¸ä¸ª Blob 对象ã ### çæ URL æµè§å¨å 许使ç¨`URL.createObjectURL()`æ¹æ³ï¼é对 Blob 对象çæä¸ä¸ªä¸´æ¶ URLï¼ä»¥ä¾¿äºæäº API 使ç¨ãè¿ä¸ª URL 以`blob://`å¼å¤´ï¼è¡¨æå¯¹åºä¸ä¸ª Blob 对象ï¼å议头å颿¯ä¸ä¸ªè¯å«ç¬¦ï¼ç¨æ¥å¯ä¸å¯¹åºå åéé¢ç Blob 对象ãè¿ä¸ç¹ä¸`data://URL`ï¼URL å å«å®é æ°æ®ï¼å`file://URL`ï¼æ¬å°æä»¶ç³»ç»éé¢çæä»¶ï¼é½ä¸ä¸æ ·ã ```javascript var droptarget = document.getElementById('droptarget'); droptarget.ondrop = function (e) { var files = e.dataTransfer.files; for (var i = 0; i < files.length; i++) { var type = files[i].type; if (type.substring(0,6) !== 'image/') continue; var img = document.createElement('img'); img.src = URL.createObjectURL(files[i]); img.onload = function () { this.width = 100; document.body.appendChild(this); URL.revokeObjectURL(this.src); } } } ``` ä¸é¢ä»£ç éè¿ä¸ºææ¾çå¾çæä»¶çæä¸ä¸ª URLï¼äº§çå®ä»¬ç缩ç¥å¾ï¼ä»è使å¾ç¨æ·å¯ä»¥é¢è§éæ©çæä»¶ã æµè§å¨å¤ç Blob URL å°±è·æ®éç URL 䏿 ·ï¼å¦æ Blob 对象ä¸åå¨ï¼è¿å404ç¶æç ï¼å¦æè·¨å请æ±ï¼è¿å403ç¶æç ãBlob URL åªå¯¹ GET è¯·æ±ææï¼å¦æè¯·æ±æåï¼è¿å200ç¶æç ãç±äº Blob URL å°±æ¯æ®é URLï¼å æ¤å¯ä»¥ä¸è½½ã ### 读åæä»¶ åå¾ Blob 对象以åï¼å¯ä»¥éè¿`FileReader`对象ï¼è¯»å Blob 对象çå 容ï¼å³æä»¶å 容ã FileReader 对象æä¾åä¸ªæ¹æ³ï¼å¤ç Blob 对象ãBlob 对象ä½ä¸ºåæ°ä¼ å ¥è¿äºæ¹æ³ï¼ç¶å以æå®çæ ¼å¼è¿åã - `FileReader.readAsText()`ï¼è¿åææ¬ï¼éè¦æå®ææ¬ç¼ç ï¼é»è®¤ä¸º UTF-8ã - `FileReader.readAsArrayBuffer()`ï¼è¿å ArrayBuffer 对象ã - `FileReader.readAsDataURL()`ï¼è¿å Data URLã - `FileReader.readAsBinaryString()`ï¼è¿ååå§çäºè¿å¶å符串ã ä¸é¢æ¯`FileReader.readAsText()`æ¹æ³çä¾åï¼ç¨æ¥è¯»åææ¬æä»¶ã ```javascript // HTML 代ç å¦ä¸ // //
function readfile(f) { var reader = new FileReader(); reader.readAsText(f); reader.onload = function () { var text = reader.result; var out = document.getElementById('output'); out.innerHTML = ''; out.appendChild(document.createTextNode(text)); } reader.onerror = function(e) { console.log('Error', e); }; } ``` ä¸é¢ä»£ç ä¸ï¼éè¿æå® FileReader å®ä¾å¯¹è±¡ç`onload`çå¬å½æ°ï¼å¨å®ä¾ç`result`屿§ä¸æ¿å°æä»¶å 容ã ä¸é¢æ¯`FileReader.readAsArrayBuffer()`æ¹æ³çä¾åï¼ç¨äºè¯»åäºè¿å¶æä»¶ã ```javascript // HTML 代ç å¦ä¸ // function typefile(file) { // æä»¶å¼å¤´çå个åèï¼çæä¸ä¸ª Blob 对象 var slice = file.slice(0, 4); var reader = new FileReader(); // 读åè¿å个åè reader.readAsArrayBuffer(slice); reader.onload = function (e) { var buffer = reader.result; // å°è¿å个åèçå 容ï¼è§ä½ä¸ä¸ª32使´æ° var view = new DataView(buffer); var magic = view.getUint32(0, false); // æ ¹æ®æä»¶çåå个åèï¼å¤æå®çç±»å switch(magic) { case 0x89504E47: file.verified_type = 'image/png'; break; case 0x47494638: file.verified_type = 'image/gif'; break; case 0x25504446: file.verified_type = 'application/pdf'; break; case 0x504b0304: file.verified_type = 'application/zip'; break; } console.log(file.name, file.verified_type); }; } ```