IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 实现图片本地化 ServiceWorker + IndexedDB -> 正文阅读

[JavaScript知识库]实现图片本地化 ServiceWorker + IndexedDB

在这里插入图片描述

1. 背景

在一些安全场景,或者一些本地化的场景(如本地化的 Markdown 记事本),如果有图片上传并需要查看的场景,在不上传到服务器的情况下,实现这个效果,通常是把图片 Base64 化,但编码后的字符串会非常长,体验较差。

这里不妨尝试使用 ServiceWorker + IndexedDB 来解决这个问题。

2. API 优势

IndexedDB 几乎什么都可以存储,二进制类的文件更不在话下,且存储空间在大多数浏览器中,是和系统空间持平的。

ServiceWorker 可以做页面的网络代理层,所以就不需要 Base64 化了,可以直接写一个特定规则的图片地址,实现从 IndexedDB 中 读/写 文件。

3. 实现

例如把这种特殊的图片采用 .dbimg 后缀。

上传图片时,就可以通过拦截上传请求的方式实现,流程如下:

image

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 后缀实现,流程如下:

image

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. 效果

体验地址:https://lecepin.github.io/file-proxy-indexedDB/

? 仓库地址:https://github.com/lecepin/file-proxy-indexedDB

image

image

image

? 原文地址

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:02:04  更:2022-03-17 22:02:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:02:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码