首页 > 其他分享 >indexdb 存储blob文件

indexdb 存储blob文件

时间:2024-12-17 21:20:20浏览次数:5  
标签:存储 const request indexdb Blob event store blob

直接存储blob

以下是一个简单的 IndexedDB 封装方法,用于存储和检索 Blob 文件:

class IndexedDBStore {
  constructor(dbName, storeName) {
    this.dbName = dbName;
    this.storeName = storeName;
    this.db = null;
  }

  // 打开数据库
  openDB() {
    return new Promise((resolve, reject) => {
      const request = indexedDB.open(this.dbName, 1);

      request.onupgradeneeded = event => {
        const db = event.target.result;
        if (!db.objectStoreNames.contains(this.storeName)) {
          db.createObjectStore(this.storeName);
        }
      };

      request.onsuccess = event => {
        this.db = event.target.result;
        resolve(this.db);
      };

      request.onerror = event => {
        reject('Database error: ' + event.target.errorCode);
      };
    });
  }

  // 存储 Blob 文件
  storeBlob(key, blob) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, 'readwrite');
      const store = transaction.objectStore(this.storeName);
      const request = store.put(blob, key);

      request.onsuccess = () => {
        resolve('Blob stored successfully');
      };

      request.onerror = event => {
        reject('Error storing blob: ' + event.target.errorCode);
      };
    });
  }

  // 检索 Blob 文件
  retrieveBlob(key) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, 'readonly');
      const store = transaction.objectStore(this.storeName);
      const request = store.get(key);

      request.onsuccess = event => {
        const blob = event.target.result;
        resolve(blob);
      };

      request.onerror = event => {
        reject('Error retrieving blob: ' + event.target.errorCode);
      };
    });
  }

  // 删除 Blob 文件
  deleteBlob(key) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, 'readwrite');
      const store = transaction.objectStore(this.storeName);
      const request = store.delete(key);

      request.onsuccess = () => {
        resolve('Blob deleted successfully');
      };

      request.onerror = event => {
        reject('Error deleting blob: ' + event.target.errorCode);
      };
    });
  }
}

// 使用示例
const store = new IndexedDBStore('myDatabase', 'myStore');

// 打开数据库
store.openDB().then(() => {
  // 存储一个 Blob 文件
  const blob = new Blob(['Hello, world!'], { type: 'text/plain' });
  store.storeBlob('myBlob', blob).then(message => {
    console.log(message);

    // 检索 Blob 文件
    store.retrieveBlob('myBlob').then(blob => {
      console.log(blob);

      // 删除 Blob 文件
      store.deleteBlob('myBlob').then(message => {
        console.log(message);
      });
    });
  });
});

在这个示例中,我们创建了一个 IndexedDBStore 类,它包含打开数据库、存储 Blob 文件、检索 Blob 文件和删除 Blob 文件的方法。使用这个类,你可以轻松地在 IndexedDB 中存储和检索 Blob 文件。

请注意,IndexedDB 操作是异步的,因此我们使用 Promise 来处理操作的结果。此外,你需要确保在调用存储、检索或删除方法之前已经打开了数据库。

blob转为二进制存储

class IndexedDBStore {
  constructor(dbName, storeName) {
    this.dbName = dbName;
    this.storeName = storeName;
    this.db = null;
  }

  // 打开数据库
  openDB() {
    return new Promise((resolve, reject) => {
      const request = indexedDB.open(this.dbName, 1);

      request.onupgradeneeded = event => {
        const db = event.target.result;
        if (!db.objectStoreNames.contains(this.storeName)) {
          db.createObjectStore(this.storeName);
        }
      };

      request.onsuccess = event => {
        this.db = event.target.result;
        resolve(this.db);
      };

      request.onerror = event => {
        reject('Database error: ' + event.target.errorCode);
      };
    });
  }

  // 存储 Blob 文件
  storeBlob(key, blob, fileName) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, 'readwrite');
      const store = transaction.objectStore(this.storeName);

      // 将 Blob 转换为二进制数据
      const reader = new FileReader();
      reader.onloadend = () => {
        const data = reader.result;
        const fileData = { data, fileName };
        const request = store.put(fileData, key);

        request.onsuccess = () => {
          resolve('Blob stored successfully');
        };

        request.onerror = event => {
          reject('Error storing blob: ' + event.target.errorCode);
        };
      };
      reader.onerror = event => {
        reject('Error reading blob: ' + event.target.errorCode);
      };
      reader.readAsArrayBuffer(blob);
    });
  }

  // 检索 Blob 文件
  retrieveBlob(key) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, 'readonly');
      const store = transaction.objectStore(this.storeName);
      const request = store.get(key);

      request.onsuccess = event => {
        const fileData = event.target.result;
        if (fileData) {
          // 将二进制数据转换为 Blob
          const blob = new Blob([fileData.data], { type: 'application/octet-stream' });
          resolve({ blob, fileName: fileData.fileName });
        } else {
          resolve(null);
        }
      };

      request.onerror = event => {
        reject('Error retrieving blob: ' + event.target.errorCode);
      };
    });
  }

  // 删除 Blob 文件
  deleteBlob(key) {
    return new Promise((resolve, reject) => {
      const transaction = this.db.transaction(this.storeName, 'readwrite');
      const store = transaction.objectStore(this.storeName);
      const request = store.delete(key);

      request.onsuccess = () => {
        resolve('Blob deleted successfully');
      };

      request.onerror = event => {
        reject('Error deleting blob: ' + event.target.errorCode);
      };
    });
  }
}

// 使用示例
const store = new IndexedDBStore('myDatabase', 'myStore');

// 打开数据库
store.openDB().then(() => {
  // 存储一个 Blob 文件
  const blob = new Blob(['Hello, world!'], { type: 'text/plain' });
  const fileName = 'hello.txt';
  store.storeBlob('myBlob', blob, fileName).then(message => {
    console.log(message);

    // 检索 Blob 文件
    store.retrieveBlob('myBlob').then(fileData => {
      if (fileData) {
        console.log('Blob retrieved successfully');
        console.log('File Name:', fileData.fileName);
        // 你可以在这里使用 fileData.blob
      } else {
        console.log('Blob not found');
      }

      // 删除 Blob 文件
      store.deleteBlob('myBlob').then(message => {
        console.log(message);
      });
    });
  });
});

在这个修改后的示例中,我们使用 FileReader 对象将 Blob 转换为二进制数据(ArrayBuffer),并将文件名和二进制数据一起存储到 IndexedDB 中。在检索时,我们将二进制数据转换回 Blob,并返回文件名和 Blob 对象。

这样,你就可以在 IndexedDB 中存储和检索包含文件名的 Blob 数据了。

标签:存储,const,request,indexdb,Blob,event,store,blob
From: https://www.cnblogs.com/jocongmin/p/18613430

相关文章

  • LiteGBS国标GB28181视频平台服务器添加存储池失败,如何处理?
    从技术发展趋势来看,人工智能与视频监控的结合将更加紧密。在未来,LiteGBS国标GB28181设备管理软件将进一步整合人工智能技术,实现智能识别、行为分析等功能。例如,在智能安防领域,通过对监控画面的实时分析,能够自动识别异常行为并及时发出告警,提高安防效率。那么当用户遇到服务器添......
  • 在 Windows Server 2022 中配置和使用 iSCSI 服务器是一项常见的任务,尤其是在虚拟化、
     在WindowsServer2022中配置和使用iSCSI服务器是一项常见的任务,尤其是在虚拟化、存储管理和备份等场景中。以下是一个初级使用教程的大纲,帮助你从头开始配置和使用iSCSI服务器。WindowsServer2022iSCSI服务器初级使用教程大纲1. 介绍与概念iSCSI概述什么是......
  • 硬盘空间消失之谜:Linux 服务器存储排查与优化全过程
    前言最近线上服务经常出现一些奇奇怪怪的问题,比如网页上的静态资源加载不出来,或者请求后端莫名报错,又或者Redis报错…当我SSH登录到服务器上时,更不对劲了,敲个命令都卡顿…如果是以前没经验,或许会以为遇到了疑难杂症,但作为多年的Linux用户,我已经知道了这种种异常的背后是......
  • 5 Oracle PL/SQL 存储过程--函数--包
    一、存储过程之前写的代码declarebeginend;称为匿名块,没有名称,没有存储在数据库中;存储过程:StoredProcedure,简称sp、存过,它是一种数据库对象,它遵从PL/SQL基本语法;语法:CREATE[ORREPLACE]PROCEDURE存储过程名[参数1[IN/OUT]参数类型,参数2[IN/OUT]参数类型,...]IS|AS声明......
  • 为什么 Oracle 和 Sql Server 都能用存储过程,到了 MySQL 这却不让用!
    在日常开展MySQL运维工作的过程中,常常会碰到这样一种状况。研发部门的同学总是感到疑惑,他们经常问的一个问题是:为什么在Oracle以及SqlServer这两种数据库里都能够使用存储过程,可一到MySQL这儿,却压根不让用了呢。向DBA询问原因时,得到的回复往往只是说性能不行,但从来......
  • Web3生态揭秘:区块链、智能合约与去中心化存储的核心技术解析
    Web3是互联网的下一代形态,标志着从中心化网络向去中心化网络的转型。Web3的核心价值在于重构用户与互联网的关系,使得用户拥有对数据、身份和资产的完全控制权,而不再依赖于中心化的公司或平台。为了实现这一目标,Web3依赖于三大核心技术:区块链、智能合约和去中心化存储。这些技......
  • 4.mysql中的存储过程
    创建存储过程和函数CREATE [DEFINER={USER|CURRENT_USER}]#定义者是谁 PROCEDUREsp_name([proc_parameter[,...]]) [characteristic...]routine_body CREATE [DEFINER={USER|CURRENT_USER}] FUNCTIONsp_name([function_name[,...]]) [characteristic.......
  • 打造AI驱动的数据库应用:使用Google Bigtable存储和管理Langchain文档
    打造AI驱动的数据库应用:使用GoogleBigtable存储和管理Langchain文档引言GoogleBigtable是一种高性能的键值和宽列存储数据库,专为快速访问结构化、半结构化或非结构化数据而设计。随着AI技术的发展,数据库应用可以利用Bigtable的功能和Langchain集成来提供更智能的用户体......
  • 文件存储空间管理
    文件存储空间管理‍​​‍一、存储空间的划分与初始化概念:划分物理磁盘为一个个文件卷/逻辑卷/逻辑盘各个文件卷划分为目录区和文件区​​‍二、存储空间管理方法类比内存空间管理,只是对象不同,这里针对磁盘。(一)空闲表法适用于​连续分配​。回顾:第3.5节内存管理的......
  • 【MySQL内核】MySQL中的表数据是如何存储的?
    MySQL是基于磁盘进行数据存储的关系型数据库,所有的数据和索引都以磁盘文件的方式存储,在有需要时载入内存读取。MySQL支持多种存储引擎,不同的存储引擎保存的文件不同。InnoDB是MySQL使用最为广泛的存储引擎,下面我们以InnoDB引擎为例来说明。当我们创建一个数据库表时,InnoDB会......