/*
* 参数
* 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. img格式镜像转ISO格式

    在做汇编学习时,需要用比较老的Windows XP来进行调试学习,因此找了最老的Windows XP(CN_WINXP_PRO_ISO,无SP版本 ),下载后发现镜像文件格式是img的,而virtua ...

  2. SSH开发环境搭建

    断断续续学习hibernate也有一段时间了,在这里研究一下SSH开发环境的搭建过程,自己简单的搭建一个SSH的开发环境.采用maven搭建. 0.项目结构: 1.导包:(maven项目) pom.x ...

  3. Java读取Txt封装到对象中——(三)

    JavaBean package bean; public class Question { private String timu; //题干 private String leixing; //类 ...

  4. Bootstrap2.x与Bootstrap3.x的区别

    做项目时,有时也会参考别的案例的优秀之处.在用Bootstrap的时候,发现很多项目代码都有区别,在<div>布局class上,有用.span*,有用.col-md-*,实际上是Boots ...

  5. pyspider使用

    #!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2018-11-08 22:33:55 # Project: qsbk fro ...

  6. ES系列十七、logback+ELK日志搭建

    一.ELK应用场景 在复杂的企业应用服务群中,记录日志方式多种多样,并且不易归档以及提供日志监控的机制.无论是开发人员还是运维人员都无法准确的定位服务.服务器上面出现的种种问题,也没有高效搜索日志内容 ...

  7. Java发送邮件时标题和发件人乱码

    最近碰到一个问题,Java发送邮件时,查看邮箱结果,发件人及邮件标题正文全部乱码 通过翻阅资料,原因及解决方法如下: // Set Subject: 头字段 message.setSubject(Mi ...

  8. 实现自己的Koa2

    这部分的代码在https://github.com/zhaobao1830/koa2中demo文件夹中 Koa就是基于node自带的http模块,经过封装,监听端口,实现ctx(上下文)管理,中间件管 ...

  9. visual studio 2017 installer 安装包的安装必备组件设置

    visual studio installer 2017  安装包的安装必备组件设置,默认设置只有net frmwork 4.6.1,如下图 这个时候如果打包安装,那么打出来的包一定需要先安装4.6. ...

  10. vue+element之多表单验证

    方法一:利用promise var p1=new Promise(function(resolve, reject) { this.$refs[form1].validate((valid) => ...