/*
* 参数
* 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

(原创)PouchDB 图片本地存储(web离线应用)的更多相关文章

  1. iOS 图片本地存储、本地获取、本地删除

    在iOS开发中.经常用到图片的本地化. iOS 图片本地存储.本地获取.本地删除,可以通过以下类方法实现. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: ...

  2. HTML5 本地存储Web Storage简单了解

    ​HTML5本地存储规范,定义了两个重要的API :Web Storage  和  本地数据库Web SQL Database. 本地存储Web Storage 实际上是HTML4的cookie存储机 ...

  3. HTML5本地存储——Web SQL Database

    在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...

  4. HTML5本地存储 Web Storage

    Web Storage基本介绍 HTML5 定义了本地存储规范 Web Storage , 提供了两种存储类型 API  sessionStorage 和 localStorage,二者的差异主要是数 ...

  5. [转]HTML5本地存储——Web SQL Database

    在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...

  6. 本地存储 web storage

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. HTML5开发学习:本地存储Web Sql Database

       Web Sql Database,中文翻译作"本地数据库",是随着HTML5规范加入的在浏览器端运行的轻量级数据库.    在HTML5中,大大丰富了客户端本地可以存储的内容 ...

  8. HTML5本地存储——Web SQL Database与indexedDB

    虽然在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数 ...

  9. html5本地存储web storage的简单使用

    html5的一个非常cool的功能,就是web storage,类似于之前的cookie,不过与之不同的是,web storage 拥有本地5兆的容量可以存储,而cookie却只有4K,这是完全不能比 ...

随机推荐

  1. Linux input子系统简介

    1.前言 本文主要对Linux下的input子系统进行介绍 2. 软件架构 图 input子系统结构图 input子系统主要包括三个部分:设备驱动层.核心层和事件层.我们可以分别理解为:具体的输入设备 ...

  2. driver: linux2.6 内核模块导出函数实例(EXPORT_SYMBOL) 【转】

    转自:http://blog.chinaunix.net/uid-23381466-id-3837650.html 内核版本:2.6.38-11-generic 内核自己都大量利用内核符号表导出函数, ...

  3. xargs -i和-I的区别【转】

    xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如  # find . -type f -name "*.log" | xargs rm -rf * ...

  4. Date ——日期型函数Date常用API

     获取当前时间戳: let now = new Date().getTime() 获取某个时间点(比如12点)的时间戳: let date = new Date('2019-01-12 12:00:0 ...

  5. Ex 6_2 假设您准备一次长途旅行..._第五次作业

    假设n个旅馆距离原点的距离存放在数组arr[0. . .n-1]中,punish[0. . .n-1]表示在某个旅馆停留时所受的的惩罚的最小值.当然在第一个旅馆停留时所受到的惩罚为0,即punish[ ...

  6. idea开发swing(二)

    闲话少说,书接idea开发swing(一). 程序编译完成后,需要打包发布,如果有fat_jar的同学可以通过该插件打包,这里是使用ant来打包,步骤如下: 一.编写build.xml <?xm ...

  7. [翻译] 一个kubernetes网络简明教程[Part 1]

    一个kubernetes网络简明教程[Part 1] 翻译: icebug 所有我学到的关于kubernetes网络的事情 你可能已经在kubernetes集群当中跑了一堆服务并且正在享受其带来的好处 ...

  8. 关于引用外部类要用static 的问题

    一.直接用 static 引用 import static net.mindview.util.Print.*; //net...为引用的类,此方法在程序加载时就已实例化 二. 也可以手动在需要时实例 ...

  9. pytest二:setup和teardown

    用例运行级别 模块级(setup_module/teardown_module)开始于模块始末,全局的 函数级(setup_function/teardown_function)只对函数用例生效(不在 ...

  10. 步步为营-54-DOM

    说明:DOM document object model 文档对象模型.将所有的标记加载到内存中,以树形结构处理 1.1 使用JavaScript操作DOM,主要包括两个部分 Browser对象:BO ...