IndexedDB 将范围另存为

vngu2lb8  于 2022-12-16  发布在  IndexedDB
关注(0)|答案(2)|浏览(221)

好吧,我是IndexedDB新手,对Javascript不是很有经验。现在,我已经编写了一些代码,用户可以浏览到他们文件系统上的一个文件,当选择该文件时,该文件会被分解成块(通过使用slice),这些块会被转换为十六进制字符串,字符串(沿着一个键)会存储在IndexedDB中。
这种模态的好处是用户可以选择一个非常大的文件,而且,由于我使用了正确的构造,所以不必一次将整个文件加载到内存中。
现在,我尝试重新读取这些十六进制字符串,并在用户单击按钮时让浏览器弹出“另保存为”对话框。问题是,我还没有找到一种方法来将数据从IndexedDB“流式”到另存为输入中。你们中有人知道这样做的方法吗?我的方法相当有限。
谢谢

eoxn13cs

eoxn13cs1#

IndexedDB不能对记录进行部分(或投影)读/写。API似乎是有可能的,因为它是用于像对大文件进行顺序查找这样的用例,但我不确定。
你可能想看看最近的讨论IndexedDB, Blobs and partial Blobs - Large Files,他们也讨论了你的问题的解决方法。

jyztefdp

jyztefdp2#

因此,我也希望这样做,并将随着实施的进展更新这个答案。
其思想是在indexdb中创建两个实体类型。
1.锉
1.页
对于存储在 IndexedDB 中的每个文件,文件实体中都将有一个条目。
文件的内容将存储在页面实体中。内容将被拆分为“页面”,其中每个页面都是某个(任意)固定大小,如16KB。
我的代码将在dart中编写(交叉编译为javascript),但逻辑应该很容易直接移植到js。
我将创建一个类,它的操作有点像随机访问文件。
注意:这只是伪代码。

class RandomAccessFile {
       const int pageSize = 16192;
       int offset = 0;
       int page = 0;
       int inPageOffset = 0;
       List<int> currentPageData;
       String pathToFile;
       late int fileSize;
       RandomAccessFile(this.pathToFile)
       {
          var file = indexDb.read('File', this.pathToFile);
          this.fileSize = file.size;
       }

       void seekTo(int offset)
       {
          this.offset = offset;
          this.page = offset/pageSize;
          this.inPageOffset = offset % pageSize;
        }    
      Stream<int> read() async * {
      { 
         
         _loadPage();
         while (this.offset < fileSize)
         {
             
             while (this.inPageOffset < currentPageData.length) 
             {  
                  yield currentPageData[this.inPageOffset++];
             }
             _loadNextPage()
         }
      }
      void _loadPage()
      {
          currentPageData =  indexDb.read('Page', where file = pathTofile and pageNo = page);
          pageOffset = 0;
       }

  void _loadNextPage()
      {
         page++;
         _loadPage();
           
       }
}

相关问题