成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Web 開發中 Blob 與 FileAPI 使用簡述

開發 開發工具
本文節選自 Awesome CheatSheet/DOM CheatSheet,主要是對 DOM 操作中常見的 Blob、File API 相關概念進行簡要描述。

 本文節選自 Awesome CheatSheet/DOM CheatSheet,主要是對 DOM 操作中常見的 Blob、File API 相關概念進行簡要描述。

[[238178]]

Web 開發中 Blob 與 FileAPI 使用簡述

Blob 是 JavaScript 中的對象,表示不可變的類文件對象,里面可以存儲大量的二進制編碼格式的數據。Blob 對象的創建方式與其他并無區別,構造函數可接受數據序列與類型描述兩個參數:

  1. const debug = { hello: 'world' };let blob = new Blob([JSON.stringify(debug, null, 2)], { 
  2.   type: 'application/json'});// Blob(22) {size: 22, type: "application/json"}// 也可以轉化為類 URL 格式const url = URL.createObjectURL(blob);// "blob:https://developer.mozilla.org/88c5b6de-3735-4e02-8937-a16cc3b0e852"// 設置自定義的樣式類blob = new Blob(['body { background-color: yellow; }'], { 
  3.   type: 'text/css'}); 
  4.  
  5. link = document.createElement('link'); 
  6. link.rel = 'stylesheet';//createObjectURL returns a blob URL as a string.link.href = URL.createObjectURL(blob); 

其他的類型轉化為 Blob 對象可以參考 covertToBlob.js,將 Base64 編碼的字符串或者 DataUrl 轉化為 Blob 對象。Blob 包括了 size 與 type,以及常用的用于截取的 slice 方法等屬性。Blob 對象能夠添加到表單中,作為上傳數據使用:

  1. const content = '<a id="a"><b id="b">hey!</b></a>'; // the body of the new file...const blob = new Blob([content], { type: 'text/xml' }); 
  2. formData.append('webmasterfile', blob); 

slice 方法會返回一個新的 Blob 對象,包含了源 Blob 對象中指定范圍內的數據。其實就是對這個 blob 中的數據進行切割,我們在對文件進行分片上傳的時候需要使用到這個方法,即把一個需要上傳的文件進行切割,然后分別進行上傳到服務器:

  1. const BYTES_PER_CHUNK = 1024 * 1024; // 每個文件切片大小定為1MB .const blob = document.getElementById('file').files[0];const slices = Math.ceil(blob.size / BYTES_PER_CHUNK);const blobs = [];Array.from({ length: slices }).forEach(function(item, index) { 
  2.   blobs.push(blob.slice(indexindex + 1)); 
  3. }); 

這里我們使用的 blob 對象實際上是 HTML5 中的 File 對象;HTML5 File API 允許我們對本地文件進行讀取、上傳等操作,主要包含三個對象:File,FileList 與用于讀取數據的 FileReader。File 對象就是 Blob 的分支,或者說子集,表示包含某些元數據的單一文件對象;FileList 即是文件對象的列表。FileReader 能夠用于從 Blob 對象中讀取數據,包含了一系列讀取文件的方法與事件回調,其基本用法如下:

  1. const reader = new FileReader(); 
  2. reader.addEventListener('loadend'function() { 
  3.   // reader.result 包含了 Typed Array 格式的 Blob 內容}); 
  4. reader.readAsArrayBuffer(blob); 
  5.  
  6. blob = new Blob(['This is my blob content'], { type: 'text/plain' }); 
  7. read.readAsText(bolb); // 讀取為文本// reader.readAsArrayBuffer   //將讀取結果封裝成 ArrayBuffer ,如果想使用一般需要轉換成 Int8Array 或 DataView// reader.readAsBinaryString  // 在IE瀏覽器中不支持改方法// reader.readAsTex // 該方法有兩個參數,其中第二個參數是文本的編碼方式,默認值為 UTF-8// reader.readAsDataURL  // 讀取結果為DataURL// reader.readyState // 上傳中的狀態 

在圖片上傳中,我們常常需要獲取到本地圖片的預覽,參考 antd/Upload 中的處理:

  1. // 將文件讀取為 DataURLconst previewFile = (file: File, callback: Function) => { 
  2.   const reader = new FileReader(); 
  3.   reader.onloadend = () => callback(reader.result); 
  4.   reader.readAsDataURL(file); 
  5. }; 
  6. // 設置文件的 DataUrlpreviewFile(file.originFileObj, (previewDataUrl: string) => { 
  7.   file.thumbUrl = previewDataUrl; 
  8. }); 
  9. // JSX<img src={file.thumbUrl || file.url} alt={file.name} />; 

另一個常用的場景就是獲取剪貼板中的圖片,并將其預覽展示,可以參考 coding-snippets/image-paste:

  1. const cbd = e.clipboardData;const fr = new FileReader(); 
  2. for (let i = 0; i < cbd.items.length; i++) { 
  3.   const item = cbd.items[i]; 
  4.  
  5.   if (item.kind == 'file') { 
  6.     const blob = item.getAsFile(); 
  7.     if (blob.size === 0) { 
  8.       return
  9.     } 
  10.  
  11.     previewFile(blob); 
  12.   } 

標準的 Web 標準中提供了 FileReader 對象進行讀取操作,不過 Chrome 中提供了 FileWriter 對象,允許我們在瀏覽器沙盒中創建文件,其基于 requestFileSystem 方法:

  1. // 僅可用于 Chrome 瀏覽器中window.requestFileSystem = 
  2.   window.requestFileSystem || window.webkitRequestFileSystem; 
  3. window.requestFileSystem(type, size, successCallback, opt_errorCallback); 

簡單的文件創建與寫入如下所示:

  1. function onInitFs(fs) { 
  2.   fs.root.getFile( 
  3.     'log.txt'
  4.     { createtrue }, 
  5.     function(fileEntry) { 
  6.       // Create a FileWriter object for our FileEntry (log.txt).      fileEntry.createWriter(function(fileWriter) { 
  7.         fileWriter.onwriteend = function(e) { 
  8.           console.log('Write completed.'); 
  9.         }; 
  10.  
  11.         fileWriter.onerror = function(e) { 
  12.           console.log('Write failed: ' + e.toString()); 
  13.         }; 
  14.  
  15.         // Create a new Blob and write it to log.txt.        var blob = new Blob(['Lorem Ipsum'], { type: 'text/plain' }); 
  16.  
  17.         fileWriter.write(blob); 
  18.       }, errorHandler); 
  19.     }, 
  20.     errorHandler 
  21.   ); 
  22. window.requestFileSystem(window.TEMPORARY, 1024 * 1024, onInitFs, errorHandler); 

 【本文是51CTO專欄作者“張梓雄 ”的原創文章,如需轉載請通過51CTO與作者聯系】

戳這里,看該作者更多好文

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2009-07-06 10:49:34

Web開發

2012-02-23 10:32:19

HTML 5

2022-07-25 20:43:28

Web

2009-09-22 11:49:34

ibmdwREST

2011-08-17 15:10:21

iPhone開發Web視圖

2010-08-02 16:23:25

ibmdwWebSphereWeb2.0

2010-09-14 09:19:40

2009-11-23 14:38:02

Visual Stud

2009-03-09 10:28:45

AJAXASP.NETWEB

2015-06-25 15:56:08

2014-12-24 09:54:30

2015-09-17 11:04:46

2010-06-24 08:55:11

Web開發Web設計Web語言

2009-07-29 09:38:06

Web開發ASP.NET

2024-07-01 00:00:06

ASP.NET開源

2009-07-15 16:26:04

iBATIS Clob

2019-11-25 11:20:08

FlutterWeb應用軟件開發

2011-08-23 17:52:39

LUAWeb 開發

2011-03-24 11:37:41

Hibernate

2013-05-21 09:54:39

Web前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品视频在线免费观看 | 亚洲综合视频 | 无人区国产成人久久三区 | 国产精品揄拍一区二区久久国内亚洲精 | 国产成人一区二区三区久久久 | 国产精品一区二区在线免费观看 | 放个毛片看看 | 亚洲精品三级 | 国产精品久久久久久久久久免费 | 丁香婷婷在线视频 | 精品国产1区2区3区 在线国产视频 | 国偷自产av一区二区三区 | 亚洲精品v | 久久精品国产一区二区电影 | 一区二区免费 | 免费的色网站 | 啪啪毛片 | 97精品久久 | 亚洲高清在线观看 | 成人免费网视频 | 国产一区二区高清在线 | 热久久免费视频 | 午夜专区| 久久6视频 | 欧美日韩a| 久久99精品久久久久久国产越南 | 久久精品国产一区二区电影 | 精品欧美一区二区在线观看欧美熟 | 成人欧美一区二区三区在线观看 | 欧美黄色小视频 | 中文字幕丁香5月 | 日韩网站免费观看 | 99精品欧美一区二区三区 | 成人免费视频一区二区 | 亚洲国产精品一区二区久久 | 日韩在线视频免费观看 | 污免费网站 | 人妖一区 | 日韩国产免费观看 | 精品一区二区三区在线视频 | 亚洲国产精品一区 |