(原创)PouchDB 图片本地存储(web离线应用)
/*
* 参数
* 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离线应用)的更多相关文章
- iOS 图片本地存储、本地获取、本地删除
在iOS开发中.经常用到图片的本地化. iOS 图片本地存储.本地获取.本地删除,可以通过以下类方法实现. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: ...
- HTML5 本地存储Web Storage简单了解
HTML5本地存储规范,定义了两个重要的API :Web Storage 和 本地数据库Web SQL Database. 本地存储Web Storage 实际上是HTML4的cookie存储机 ...
- HTML5本地存储——Web SQL Database
在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...
- HTML5本地存储 Web Storage
Web Storage基本介绍 HTML5 定义了本地存储规范 Web Storage , 提供了两种存储类型 API sessionStorage 和 localStorage,二者的差异主要是数 ...
- [转]HTML5本地存储——Web SQL Database
在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...
- 本地存储 web storage
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- HTML5开发学习:本地存储Web Sql Database
Web Sql Database,中文翻译作"本地数据库",是随着HTML5规范加入的在浏览器端运行的轻量级数据库. 在HTML5中,大大丰富了客户端本地可以存储的内容 ...
- HTML5本地存储——Web SQL Database与indexedDB
虽然在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数 ...
- html5本地存储web storage的简单使用
html5的一个非常cool的功能,就是web storage,类似于之前的cookie,不过与之不同的是,web storage 拥有本地5兆的容量可以存储,而cookie却只有4K,这是完全不能比 ...
随机推荐
- JavaScript学习 - 基础(四) - 控制语句/异常处理
控制语句 if-else 语句 <script> //控制语句 //if-else格式: var x = 1 if(x==1){ console.log("this is if& ...
- sqlplus连接远程数据库
方式一:简易连接,不用进行网络配置,其实就是tnsname.ora文件 命令:sqlplus 用户名/密码@ip地址[:端口]/service_name [as sysdba] 示例:sqlplus ...
- jQuery中对未来的元素绑定事件用bind、live or on
对未来的元素绑定事件不能用bind, 1.可以用live代替,但是要注意jquery的版本,根据官方文档,从1.7开始就不推荐live和delegate了,1.9里就去掉live了. 2.推荐用on代 ...
- Java探针-Java Agent技术-阿里面试题
Java探针参考:Java探针技术在应用安全领域的新突破 最近面试阿里,面试官先是问我类加载的流程,然后问了个问题,能否在加载类的时候,对字节码进行修改 我懵逼了,答曰不知道,面试官说可以的,使用Ja ...
- saltstack自动化运维系列⑧SaltStack实践配置管理安装nginx-1.10.3
saltstack自动化运维系列⑧SaltStack实践配置管理安装nginx-1.10.3 安装nginx-1.10.3.tar.gz # mkdir -p /srv/salt/prod/pkg / ...
- eclipse:刪除空行
ctrl+F:選擇正則,輸入:^\s*\n ,點擊 replace all.
- Android数据存储:File
Android数据存储之File Files:它通过FileInputStream和FileOuputStream对文件进行操作.但是在Android中,文件是一个应用程序私有的,一个应用程序无法读写 ...
- Oracle 相关概念
注:本文来源于 <腾科OCP培训课堂>.非准许商业活动. 标题:Oracle 相关概念 --->数据库名.实例名.数据库域名.全局数据名.服务名 一:数据库名 1:什么是数据库名 ...
- Oracle12c 性能优化攻略:攻略1-2:创建具有最优性能的表空间
问题描述: 1:表空间是存储数据库对象(例如索引 .表)的逻辑容器. 2:在创建数据库对象不为其指定存储属性,则相应的表和索引会自动继承表空间的存储特性. 故:若需要好的索引.表的性 ...
- PLSQL developer 连接不上64位Oracle 解决办法
在64位Windows7上安装Oracle后,用PLSQL developer去连接数据库出现报错: Could not load "……\bin\oci.dll" OCIDLL ...