Skip to content

Instantly share code, notes, and snippets.

@JaosnHsieh
Last active February 11, 2022 05:14
Show Gist options
  • Save JaosnHsieh/8e82ca8981d7412ee586c496b1a81cd9 to your computer and use it in GitHub Desktop.
Save JaosnHsieh/8e82ca8981d7412ee586c496b1a81cd9 to your computer and use it in GitHub Desktop.
use indexdb on browser to cache image files ( map tile image in the example)
<!-- working example https://jsfiddle.net/qz9g53bt/2/ -->
<!-- from https://github.com/allartk/leaflet.offline -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script src="https://unpkg.com/[email protected]/build/iife/index-min.js"></script>
<title>Document</title>
</head>
<body>
<div>
<button id="clean">clean idb cache</button>
</div>
<div id="msgs" />
<div id="root" />
<script type="module">
const { openDB, deleteDB } = idb;
main();
function addMsg(msg = '') {
document.getElementById('msgs').innerHTML += msg;
console.log(`$ addMsg`, msg);
}
async function main() {
const tileStoreName = 'tileStorage';
const urlTemplateIndex = 'urlTemplate';
const db = await openDB('leaflet.offline', 2, {
upgrade(db, oldVersion) {
deleteDB('leaflet_offline');
deleteDB('leaflet_offline_areas');
if (oldVersion < 1) {
const tileStore = db.createObjectStore(tileStoreName, {
keyPath: 'key',
});
tileStore.createIndex(urlTemplateIndex, 'urlTemplate');
tileStore.createIndex('z', 'z');
}
},
});
const imgEle = document.createElement('img');
const cacheKey = 'cacheImage';
const cacheImage = await db.get(tileStoreName, cacheKey);
if (cacheImage === undefined) {
fetch('https://tile.openstreetmap.org/10/836/446.png').then(
async (res) => {
const b = await res.blob();
console.log(`$ b`, b);
await db.put(tileStoreName, {
key: cacheKey,
blob: b,
});
const url = URL.createObjectURL(b);
imgEle.src = url;
addMsg('image added from fetch request');
}
);
} else {
console.log(`$ cacheImage.blob`, cacheImage.blob);
const url = URL.createObjectURL(cacheImage.blob);
imgEle.src = url;
addMsg('image added from idb cache');
}
document.getElementById('root').appendChild(imgEle);
document.getElementById('clean').onclick = () => {
db.clear(tileStoreName, cacheKey);
};
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment