日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > HTML >内容正文

HTML

使用HTML5 IndexDB存储图像和文件

發(fā)布時(shí)間:2023/12/2 HTML 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用HTML5 IndexDB存储图像和文件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用IndexedDB存儲(chǔ)圖像和文件

有一天,我們寫了關(guān)于如何在localStorage中保存圖像和文件的文章,它是關(guān)于我們今天可用的實(shí)用主義。 然而,localStorage有一些性能影響 - 我們將在稍后的博客中討論這個(gè)問題 - 并且未來期望的方法是使用IndexedDB。 在這里,我將向您介紹如何在IndexedDB中存儲(chǔ)圖像和文件,然后通過ObjectURL呈現(xiàn)它們。

本文是翻譯過來的,原文在這里Storing images and files in IndexedDB

關(guān)于作者: Robert Nyman [Editor emeritus]

Technical Evangelist & Editor of Mozilla Hacks. Gives talks & blogs about HTML5, JavaScript & the Open Web. Robert is a strong believer in HTML5 and the Open Web and has been working since 1999 with Front End development for the web - in Sweden and in New York City. He regularly also blogs at http://robertnyman.com and loves to travel and meet people.

使用IndexedDB存儲(chǔ)圖像和文件的常規(guī)步驟

首先,我們來談?wù)勎覀儗?chuàng)建一個(gè)IndexedDB數(shù)據(jù)庫(kù),將文件保存到其中然后將其讀出并顯示在頁(yè)面中的步驟:

  • 1、創(chuàng)建或打開數(shù)據(jù)庫(kù)
  • 2、創(chuàng)建一個(gè)objectStore
  • 3、將圖像文件檢索為blob
  • 4、初始化一個(gè)數(shù)據(jù)庫(kù)事物
  • 5、保存圖像blob到數(shù)據(jù)庫(kù)中去
  • 6、讀出保存的文件并從中創(chuàng)建ObjectURL并將其設(shè)置為頁(yè)面中圖像元素的src

1、創(chuàng)建或打開數(shù)據(jù)庫(kù)。

// IndexedDB window.indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB,IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.OIDBTransaction || window.msIDBTransaction,dbVersion = 1;/* Note: The recommended way to do this is assigning it to window.indexedDB,to avoid potential issues in the global scope when web browsers start removing prefixes in their implementations.You can assign it to a varible, like var indexedDB… but then you have to make sure that the code is contained within a function. */// Create/open database var request = indexedDB.open("elephantFiles", dbVersion);request.onsuccess = function (event) {console.log("Success creating/accessing IndexedDB database");db = request.result;db.onerror = function (event) {console.log("Error creating/accessing IndexedDB database");};// Interim solution for Google Chrome to create an objectStore. Will be deprecatedif (db.setVersion) {if (db.version != dbVersion) {var setVersion = db.setVersion(dbVersion);setVersion.onsuccess = function () {createObjectStore(db);getImageFile();};}else {getImageFile();}}else {getImageFile();} }// For future use. Currently only in latest Firefox versions request.onupgradeneeded = function (event) {createObjectStore(event.target.result); };

使用它的預(yù)期方法是在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)觸發(fā)onupgradeneeded事件或獲取更高版本號(hào)。 目前僅在Firefox中支持此功能,但很快將在其他Web瀏覽器中支持。 如果Web瀏覽器不支持此事件,則可以使用已棄用的setVersion方法并連接到其onsuccess事件。

2、創(chuàng)建一個(gè)objectStore(如果它尚不存在)

// Create an objectStore console.log("Creating objectStore") dataBase.createObjectStore("elephants");

在這里,您創(chuàng)建一個(gè)ObjectStore,您將存儲(chǔ)數(shù)據(jù) - 或者在我們的例子中,文件 - 并且一旦創(chuàng)建,您不需要重新創(chuàng)建它,只需更新其內(nèi)容即可。

3、將圖像文件檢索為blob

// Create XHR var xhr = new XMLHttpRequest(),blob;xhr.open("GET", "elephant.png", true); // Set the responseType to blob xhr.responseType = "blob";xhr.addEventListener("load", function () {if (xhr.status === 200) {console.log("Image retrieved");// File as responseblob = xhr.response;// Put the received blob into IndexedDBputElephantInDb(blob);} }, false); // Send XHR xhr.send();

此代碼直接將文件的內(nèi)容作為blob獲取。目前只支持Firefox。 收到整個(gè)文件后,將blob發(fā)送到函數(shù)以將其存儲(chǔ)在數(shù)據(jù)庫(kù)中。

4、初始化一個(gè)數(shù)據(jù)庫(kù)事物

// Open a transaction to the database var transaction = db.transaction(["elephants"], IDBTransaction.READ_WRITE);

要開始向數(shù)據(jù)庫(kù)寫入內(nèi)容,您需要使用objectStore名稱和要執(zhí)行的操作類型(在本例中為read和write)啟動(dòng)事務(wù)。

5、保存圖像blob到數(shù)據(jù)庫(kù)中去

// Put the blob into the dabase transaction.objectStore("elephants").put(blob, "image");

一旦事務(wù)到位,您將獲得對(duì)所需objectStore的引用,然后將您的blob放入其中并為其提供密鑰。

6、讀出保存的文件并從中創(chuàng)建ObjectURL并將其設(shè)置為頁(yè)面中圖像元素的src

// Retrieve the file that was just stored transaction.objectStore("elephants").get("image").onsuccess = function (event) {var imgFile = event.target.result;console.log("Got elephant!" imgFile);// Get window.URL objectvar URL = window.URL || window.webkitURL;// Create and revoke ObjectURLvar imgURL = URL.createObjectURL(imgFile);// Set img src to ObjectURLvar imgElephant = document.getElementById("elephant");imgElephant.setAttribute("src", imgURL);// Revoking ObjectURLURL.revokeObjectURL(imgURL); };

使用相同的事務(wù)來獲取剛剛存儲(chǔ)的圖像文件,然后創(chuàng)建一個(gè)objectURL并將其設(shè)置為頁(yè)面中圖像的src。 例如,這也可以是一個(gè)附加到腳本元素的JavaScript文件,然后它將解析JavaScript。

最后完整代碼

(function () {// IndexedDBvar indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB,IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.OIDBTransaction || window.msIDBTransaction,dbVersion = 1.0;// Create/open databasevar request = indexedDB.open("elephantFiles", dbVersion),db,createObjectStore = function (dataBase) {// Create an objectStoreconsole.log("Creating objectStore")dataBase.createObjectStore("elephants");},getImageFile = function () {// Create XHRvar xhr = new XMLHttpRequest(),blob;xhr.open("GET", "elephant.png", true);// Set the responseType to blobxhr.responseType = "blob";xhr.addEventListener("load", function () {if (xhr.status === 200) {console.log("Image retrieved");// Blob as responseblob = xhr.response;console.log("Blob:" blob);// Put the received blob into IndexedDBputElephantInDb(blob);}}, false);// Send XHRxhr.send();},putElephantInDb = function (blob) {console.log("Putting elephants in IndexedDB");// Open a transaction to the databasevar transaction = db.transaction(["elephants"], IDBTransaction.READ_WRITE);// Put the blob into the dabasevar put = transaction.objectStore("elephants").put(blob, "image");// Retrieve the file that was just storedtransaction.objectStore("elephants").get("image").onsuccess = function (event) {var imgFile = event.target.result;console.log("Got elephant!" imgFile);// Get window.URL objectvar URL = window.URL || window.webkitURL;// Create and revoke ObjectURLvar imgURL = URL.createObjectURL(imgFile);// Set img src to ObjectURLvar imgElephant = document.getElementById("elephant");imgElephant.setAttribute("src", imgURL);// Revoking ObjectURLURL.revokeObjectURL(imgURL);};};request.onerror = function (event) {console.log("Error creating/accessing IndexedDB database");};request.onsuccess = function (event) {console.log("Success creating/accessing IndexedDB database");db = request.result;db.onerror = function (event) {console.log("Error creating/accessing IndexedDB database");};// Interim solution for Google Chrome to create an objectStore. Will be deprecatedif (db.setVersion) {if (db.version != dbVersion) {var setVersion = db.setVersion(dbVersion);setVersion.onsuccess = function () {createObjectStore(db);getImageFile();};}else {getImageFile();}}else {getImageFile();}}// For future use. Currently only in latest Firefox versionsrequest.onupgradeneeded = function (event) {createObjectStore(event.target.result);}; })();

瀏覽器支持

  • URL API支持性

  • indexDb

Github源碼

總結(jié)

以上是生活随笔為你收集整理的使用HTML5 IndexDB存储图像和文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。