欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

freeflydom
2024年10月7日 9:31 本文熱度 459

使用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 robertnyman.com and loves to travel and meet people.


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


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

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

2、創(chuàng)建一個(gè)objectStore

3、將圖像文件檢索為blob

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

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

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



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


// 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 deprecated

    if (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ù)庫時(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 response

        blob = xhr.response;


        // Put the received blob into IndexedDB

        putElephantInDb(blob);

    }

}, false);

// Send XHR

xhr.send();

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


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

// Open a transaction to the database

var transaction = db.transaction(["elephants"], IDBTransaction.READ_WRITE);

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


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

// Put the blob into the dabase

transaction.objectStore("elephants").put(blob, "image");

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


6、讀出保存的文件并從中創(chuàng)建ObjectURL并將其設(shè)置為頁面中圖像元素的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 object

    var URL = window.URL || window.webkitURL;


    // Create and revoke ObjectURL

    var imgURL = URL.createObjectURL(imgFile);


    // Set img src to ObjectURL

    var imgElephant = document.getElementById("elephant");

    imgElephant.setAttribute("src", imgURL);


    // Revoking ObjectURL

    URL.revokeObjectURL(imgURL);

};

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


最后完整代碼

(function () {

    // IndexedDB

    var 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 database

    var request = indexedDB.open("elephantFiles", dbVersion),

        db,

        createObjectStore = function (dataBase) {

            // Create an objectStore

            console.log("Creating objectStore")

            dataBase.createObjectStore("elephants");

        },


        getImageFile = function () {

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

                    

                    // Blob as response

                    blob = xhr.response;

                    console.log("Blob:" + blob);


                    // Put the received blob into IndexedDB

                    putElephantInDb(blob);

                }

            }, false);

            // Send XHR

            xhr.send();

        },


        putElephantInDb = function (blob) {

            console.log("Putting elephants in IndexedDB");


            // Open a transaction to the database

            var transaction = db.transaction(["elephants"], IDBTransaction.READ_WRITE);


            // Put the blob into the dabase

            var put = transaction.objectStore("elephants").put(blob, "image");


            // 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 object

                var URL = window.URL || window.webkitURL;


                // Create and revoke ObjectURL

                var imgURL = URL.createObjectURL(imgFile);


                // Set img src to ObjectURL

                var imgElephant = document.getElementById("elephant");

                imgElephant.setAttribute("src", imgURL);


                // Revoking ObjectURL

                URL.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 deprecated

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

    };

})();


瀏覽器支持

  • URL API支持性


  • indexDb





Github源碼


作者:一兵
鏈接:https://juejin.cn/post/6844903703921557518
來源:稀土掘金
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。



該文章在 2024/10/9 11:03:36 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved