(原創)PouchDB 圖片本地存儲(web離線應用)

来源:https://www.cnblogs.com/webSciprt/archive/2018/01/19/8318382.html
-Advertisement-
Play Games

Skip to content This repository Search Pull requests Issues Marketplace Explore @VIVI863628 Sign out Unwatch 1 Star 0 Fork 0 VIVI863628/PouchDB Code I... ...


/*
* 參數
* db: 已建或未建資料庫
* pouchId: 資料庫唯一的主鍵_id
* src: 圖片img的DOM對象
* bg: 判斷是否是背景圖
* */
function addTodo(db, pouchId,src,bg) {
    // 查詢資料庫中是否有該文檔 根據主鍵pouchId查詢
    db.get(pouchId).then(function(doc) {
        return db.put({         //  如有該文檔 則更新版本號_rev
            _id: pouchId,
            _rev: doc._rev,     // 版本號
            imgFile:doc.imgFile     //圖片Blob對象
        });
    }).then(function(response) {
        // handle response
        console.log('查詢成功');     // 文檔查詢成功
        console.log(response);       // 響應查詢文檔信息
        db.get(pouchId).then(function (doc) {   // 查詢資料庫中該主鍵_id的文檔信息
            // handle doc
            var imgBlob = doc.imgFile  // blob圖片對象
            console.log(imgBlob)
            // 判斷是否存在該圖片對象Blob
            if (imgBlob) {
                // 傳入blob對象 dom對象
                showImg(imgBlob, src,bg);
            } else {
                getByRequest(db,pouchId, src);
            }
        }).catch(function (err) {
            console.log(err);
        });

    }).catch(function (err) {
        console.log(err);
        console.log('查詢失敗,進行創建')    // 文檔查詢失敗
        // 新建文檔
        db.put({
            _id: pouchId
        }).then(function (response) {
            // handle response
            console.log('創建成功')
        }).catch(function (err) {
            console.log(err);
        });
    });
}

// 傳入blob對象 顯示圖片
function showImg(imgFile, src,bg) {

    console.log("showImg" + imgFile);

    // Get window.URL object
    var URL = window.URL || window.webkitURL;

    // Create and revoke ObjectURL
    // 利用blob對象 創建一個URL對象
    var imgURL = URL.createObjectURL(imgFile);

    // Set img src to ObjectURL
    // 獲取圖片的dom對象 並將URL設置為該對象的SRC
    var imgElephant = document.getElementById(src);
    if(!bg){
        imgElephant.setAttribute("src", imgURL);
    }else{
        imgElephant.style.background = "url("+imgURL+")";
    }


    // Revoking ObjectURL
    // 當圖片載入完成後
    // 使用URL.revokeObjectURL() 方法釋放之前創建的URL對象
    imgElephant.onload = function () {
        window.URL.revokeObjectURL(this.src);
    }
}

// 當資料庫查詢主鍵 無該圖片數據時 通過項目自身存儲圖片blob
function getByRequest(db,pouchId, src) {
    // Create XHR
    var xhr = new XMLHttpRequest(), // 創建 XMLHttpRequest 對象   目前請求項目自身
        blob;
    xhr.open("GET", pouchId, true);   // 在項目中get請求該圖片
    // Set the responseType to blob
    // 將響應類型設為blob類型
    xhr.responseType = "blob";
    // 響應載入
    xhr.addEventListener("load", function () {
        // 響應為200 請求完成
        if (xhr.status === 200) {
            console.log("Image retrieved");

            // Blob as response
            blob = xhr.response;  // blob對象為響應後的對象
            console.log("Blob:" + blob);
            //  獲得blob圖片信息  存入pouchDB文檔
            save(db,blob, pouchId);
            //  從pouchDB查詢該文檔
            showImg(blob, src);
        }
    }, false);
    // Send XHR
    xhr.send();
}

//根據blob對象為keyPath  更新鍵值
function save(db,blob, pouchId) {
    // 根據主鍵_id 查詢文檔 並追加文檔imgFile內容 更新版本號_rev
    db.get(pouchId).then(function(doc) {
        return db.put({
            _id: pouchId,
            _rev: doc._rev,
            imgFile: blob
        });
    }).then(function(response) {
        // handle response
        console.log('圖片存儲成功')
        console.log(response)
    }).catch(function (err) {
        console.log(err);
    });

}
GitHub地址:https://github.com/VIVI863628/PouchDB/blob/master/IMGDB2.js

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文鏈接:一句代碼載入網路圖片到ImageView——Android Picasso 在這裡介紹一個Android框架:Picasso。 picasso是Square公司開源的一個Android圖形緩存庫,地址http://square.github.io/picasso/,可以實現圖片下載和緩存功 ...
  • 這是一個點擊之後反應超時的ANR 初步判斷是系統和服務占用資源太多,引起原生設置的ANR在原生設置“語言和輸入法”界面點擊返回鍵是在10:24:52.563,原生設置是在10:24:52.723結束,公司設置是在10:24:57.238才收到onConfigurationChanged回調,快5秒了 ...
  • 。。。求期末不掛。。。 今天完成了第四題,邏輯稍微有點糾纏,但還好問題不是很多 邏輯其實挺複雜的,也可能我基礎太差,還有就是沒來得及寫註釋,很傷。。。 這裡糾結了蠻久的,一直搞不懂這個remove的用法是什麼,好像我裡面沒寫DOM節點的數值也可以刪除。。。 其實想那個刪除對應數值的節點的時候也卡了很 ...
  • 1, 轉義字元 轉義字元:用於表示網頁中的特殊字元 XHTML不直接輸入符號,建議使用轉義字元。 &nbsp 空格; &copy 版權; &reg 註冊商標 如果輸入連續的空格要使用&的轉義字元&(&amp;)nbsp,即&amp;nbsp; 2, 水平線 <Hr> 水平線 <hr width="5 ...
  • xss攻擊(跨站腳本) 是網站應用程式的安全泄露攻擊,是代碼註入的一種。它允許惡意用戶將代碼註入到網頁上,其他用戶在觀看網頁時就會受到影響。 攻擊原理 其特點是不對伺服器端造成任何傷害,而是通過一些正常的站內交互途徑,例如發佈評論,提交含有 JavaScript 的內容文本。這時伺服器端如果沒有過濾 ...
  • 前端框架層出不窮,不過萬變不離其宗,就是從MVC過渡到MVVM。從數據映射到DOM,angular中用的是watcher對象,vue是觀察者模式,react就是state了。 React通過管理狀態實現對組件的管理,通過this.state()方法更新state。當this.setState()被調 ...
  • 在網上找了好久針對react-native的測試方法,但是沒有找到靠譜的方式。要麼很淺只是跑了一下官方的例子,要麼就是版本有點老舊,照著無法進行。jest提供的react-native例子很少,而enzyme提供的react-native-mock庫也是各種報錯,讓人很是絕望。於是乎在搜索到的信息指 ...
  • 屬性 屬性名 屬性類型 描述說明 預設值 language String 多語言設置,使用時需提前引入\locales文件夾下對應的語言文件,中文zh,引入語言文件必須放在fileinput.js之後 'en' showCaption Boolean 是否顯示被選文件的簡介 true showBro ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...