实现图片本地化 ServiceWorker + IndexedDB
前端Q
共 1724字,需浏览 4分钟
· 2022-04-07
点击上方 前端Q,关注公众号
回复加群,加入前端Q技术交流群
1. 背景
在一些安全场景,或者一些本地化的场景(如本地化的 Markdown 记事本),如果有图片上传并需要查看的场景,在不上传到服务器的情况下,实现这个效果,通常是把图片 Base64 化,但编码后的字符串会非常长,体验较差。
这里不妨尝试使用 ServiceWorker + IndexedDB 来解决这个问题。
2. API 优势
IndexedDB 几乎什么都可以存储,二进制类的文件更不在话下,且存储空间在大多数浏览器中,是和系统空间持平的。
ServiceWorker 可以做页面的网络代理层,所以就不需要 Base64 化了,可以直接写一个特定规则的图片地址,实现从 IndexedDB 中 读/写 文件。
3. 实现
例如把这种特殊的图片采用 .dbimg
后缀。
上传图片时,就可以通过拦截上传请求的方式实现,流程如下:
![](https://filescdn.proginn.com/fdbecb6326f65121eecc5dc22f342048/e917ed1e83f2bef1e93312593c362eb7.webp)
self.addEventListener("fetch", (e) => {
const url = e.request.url;
if (e.request.method == "POST" && url.indexOf("update-img") > -1) {
e.respondWith(
e.request.formData().then((data) => {
const file = data.get("img");
const name = Date.now() + Math.random().toString().substr(2, 4);
db.put("img", { name, file });
return new Response(
JSON.stringify({
name: name + ".dbimg",
})
);
})
);
}
});
复制代码
读取时,通过判断 .dbimg
后缀实现,流程如下:
![](https://filescdn.proginn.com/f5941060a1309b5e3ea2484b39a775c9/c6ea80e7ac57fb4a38d86c2f7c0acd2f.webp)
self.addEventListener("fetch", (e) => {
const url = e.request.url;
if (e.request.method == "GET" && url.substr(url.length - 6) == ".dbimg") {
const name = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));
e.respondWith(
db
.getAllMatching("img", { index: "name", query: IDBKeyRange.only(name) })
.then((data) => {
if (data.length) {
return new Response(data[0].file);
}
return new Response("", { status: 404 });
})
);
}
});
复制代码
4. 效果
体验地址:lecepin.github.io/file-proxy-…[1]
⭐ 仓库地址:github.com/lecepin/fil…[2]
![](https://filescdn.proginn.com/0d1e4ff2b8ba28d0e8ac43fe6f70779e/e335e065b86cbfb652ad5385039f862d.webp)
![](https://filescdn.proginn.com/552811c14a9eeb373a163b0a394be848/11b7bad44acba3c1d7da8a20c36e3ca9.webp)
![](https://filescdn.proginn.com/71a2202206434127fd7db7852daa3f4b/2cff511a88f0261891467c623c1b220d.webp)
关于本文
作者:lecepin
https://juejin.cn/post/7075650171471659015
![](https://filescdn.proginn.com/13c6acbd42fbc4dfc7285cc84e8255af/73ad0a099ca7430702dbc53739579cd7.webp)
往期推荐
![](https://filescdn.proginn.com/36fac610921518ea4e4bb4b7479828c5/d0d1482a9e53d5ba3dbd56206817e5e6.webp)
![](https://filescdn.proginn.com/2e91257aa86a617901a3634398b6c53b/2ad0120354530b140895f343da1580b7.webp)
![](https://filescdn.proginn.com/2e91257aa86a617901a3634398b6c53b/2ad0120354530b140895f343da1580b7.webp)
最后
欢迎加我微信,拉你进技术群,长期交流学习...
欢迎关注「前端Q」,认真学前端,做个专业的技术人...
![](https://filescdn.proginn.com/68e9df321c662be19a15b5962000fe91/9d0035892137394f12f091d657c1045f.webp)
![](https://filescdn.proginn.com/cff9049cfcfe60b78f1634e21dd2dd27/246a18618d49341cbc858cf50c2ae7ec.webp)
评论
15种时间序列预测方法总结(包含多种方法代码实现)
向AI转型的程序员都关注了这个号👇👇👇在这篇文章中,我们将深入探讨时间序列预测的基本概念和方法。我们将首先介绍单元预测和多元预测的概念,然后详细介绍各种深度学习和传统机器学习方法如何应用于时间序列预测,包括循环神经网络(RNN)、一维卷积神经网络(1D-CNN)、Transformer、自回归模型(
机器学习AI算法工程
0
SpringBoot 实现图片防盗链功能
程序员的成长之路互联网/程序员/技术/资料共享 关注阅读本文大概需要 4 分钟。来自:blog.csdn.net/weixin_46157208/article/details/138051737前言出于安全考虑,我们需要后端返回的图片只允许在某个网站内展示,不想被爬虫拿到图片地
程序员的成长之路
0
一站式解决方案:基于 Arthas 实现服务发现和权限控制
来源:juejin.cn/post/7281849496983994383👉 欢迎加入小哈的星球 ,你将获得: 专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书福利全栈前后端分离博客项目 2.0 版本完结啦, 演示链接
小哈学Java
0
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。Spring Boot整合Minio后,前端的文件上传有两种方式:1、文件上传到后端,由后端保存到Minio这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、
Java架构师社区
0
超越原生,散点图实现华夫饼图
之前我们介绍过了如何使用新卡片图实现华夫饼图。参考:超越原生,PowerBI 华夫饼图实现但是利用卡片图实现的华夫饼图有一些缺点,形状之间的大小跟间距不太好把握,而且有时形状大一点的话显示就会不正常,需要做出二次调整。今天给大家介绍一种原生视觉对象生成华夫饼图的更佳方案,既简单又美观。上图是利用散点
PowerBI战友联盟
2
Spring Boot + flowable 快速实现工作流
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。来源:blog.csdn.net/zhan107876/article/details/120815560总览一、flowable-ui部署运行二、绘制流程图绘图细节:
Java架构师社区
0
实现订单30分钟自动取消的策略
原文:juejin.cn/post/7285167401821798400简介在电商和其他涉及到在线支付的应用中,通常需要实现一个功能:如果用户在生成订单后的一定时间内未完成支付,系统将自动取消该订单。本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案,并提供实例
JAVA乐园
0