Javascript HTML5 IndexedDB-如何将所有记录合并为一个

Javascript HTML5 IndexedDB-如何将所有记录合并为一个,javascript,html,indexeddb,savefiledialog,chunks,Javascript,Html,Indexeddb,Savefiledialog,Chunks,我的想法是从服务器上下载一个大文件 存储到IndexedDB中的块 下载完所有区块后,将所有记录合并为一个(如SQL SELECT*FROM XXX…) 保存到磁盘“saveAs()”或创建指向IndexedDB的URL (或者有什么想法?) 我不知道如何做第二步。三, (下面是在DB中存储10000条记录的示例,以及步骤2之后的预期输出。应为SUSANSUSANSUSAN…) if(事务){ transaction.oncomplete=函数(){ } transaction.onabort=

我的想法是从服务器上下载一个大文件

  • 存储到IndexedDB中的块

  • 下载完所有区块后,将所有记录合并为一个(如SQL SELECT*FROM XXX…)

  • 保存到磁盘“saveAs()”或创建指向IndexedDB的URL
  • (或者有什么想法?)

    我不知道如何做第二步。三,

    (下面是在DB中存储10000条记录的示例,以及步骤2之后的预期输出。应为SUSANSUSANSUSAN…)

    if(事务){
    transaction.oncomplete=函数(){
    }
    transaction.onabort=函数(){
    WriteConsoleScreen(“事务中止”);
    localDatabase.db.close();
    }
    transaction.ontimeout=函数(){
    WriteConsoleScreen(“事务超时”);
    localDatabase.db.close();
    }
    var store=transaction.objectStore(osTableName);
    如果(商店){
    var-req;
    var customer={};
    //创造万条记录
    对于(var loop=0;loop<10000;loop++){
    客户={};
    customer.fname='Susan';
    req=存储添加(客户);
    req.onsuccess=功能(ev){
    }
    req.onerror=功能(ev){
    writeToConsoleScreen(“未能添加记录。”+”错误:“+ev.message”);
    }
    }     
    }
    }
    
    
    var open=indexedDB.open('chunks-example');
    open.onupgradeneeded=函数(){
    //如有必要,创建架构
    var db=打开的结果;
    db.createObjectStore('chunks');
    };
    // 1. 存储到IndexedDB中的块。
    open.onsuccess=函数(){
    var db=打开的结果;
    var tx=db.transaction('chunks','readwrite');
    var store=tx.objectStore('chunks');
    对于(变量i=0;i<10;++i){
    //对于realz,这将是通过
    //XMLHttpRequest.response和async。
    var chunk=new Blob(['chunk'+i+'\n'],
    {type:'application/octet stream'});
    存储。放置(chunk,i);
    }
    tx.oncomplete=function(){merge(db);};
    };
    // 2. 在“下载”所有区块后,将所有记录合并为一个
    函数合并(db){
    var tx=db.transaction('chunks');
    var store=tx.objectStore('chunks');
    var chunks=[];
    var request=store.openCursor();
    request.onsuccess=函数(){
    var cursor=request.result;
    如果(光标){
    chunks.push(cursor.value);
    cursor.continue();
    }否则{
    saveAs('myfile',新Blob(块,
    {type:'application/octet stream'}));
    }
    };
    }
    // 3. 保存到磁盘“saveAs()”
    函数saveAs(文件名,blob){
    var a=document.documentElement.appendChild(document.createElement('a'));
    a、 href=URL.createObjectURL(blob);
    a、 下载=文件名;
    a、 单击();
    a、 删除(a);
    }
    
    Q:开发者最可怕的噩梦是什么?答:当你在寻找一个问题的解决方案时,你会发现一个StackOverflow问题问的正是你想要的东西。这个问题是一年前提出来的,现在还没有人回答!我不认为这是不可能的。Mega.nz已经实施了该计划。我还在想他们是怎么做到的。
    if (transaction) {
        transaction.oncomplete = function () {
        }
        transaction.onabort = function () {
            writeToConsoleScreen("transaction aborted.");
            localDatabase.db.close();
        }
        transaction.ontimeout = function () {
            writeToConsoleScreen("transaction timeout.");
            localDatabase.db.close();
        }
        var store = transaction.objectStore(osTableName);
        if (store) {
            var req;
            var customer = {};                   
           // create ten thousand records
           for (var loop = 0; loop < 10000; loop++) {
                customer = {};
                customer.fname = 'Susan';
                req = store.add(customer);
                req.onsuccess = function (ev) {
                }
                req.onerror = function (ev) {
                    writeToConsoleScreen("Failed to add record." + "  Error: " + ev.message);
                }
            }     
        }
    }
    
    <!DOCTYPE html>
    <script>
    var open = indexedDB.open('chunks-example');
    open.onupgradeneeded = function() {
      // Create schema if necessary
      var db = open.result;
      db.createObjectStore('chunks');
    };
    
    // 1. Chunks stored into an IndexedDB.
    open.onsuccess = function() {
      var db = open.result;
      var tx = db.transaction('chunks', 'readwrite');
      var store = tx.objectStore('chunks');
      for (var i = 0; i < 10; ++i) {
        // For realz, this would be via
        // XMLHttpRequest.response and async.
        var chunk = new Blob(['chunk ' + i + '\n'],
          {type: 'application/octet-stream'});
        store.put(chunk, i);
      }
      tx.oncomplete = function() { merge(db); };
    };
    
    // 2. After "download" all chunks, merge all records into one
    function merge(db) {
      var tx = db.transaction('chunks');
      var store = tx.objectStore('chunks');
      var chunks = [];
      var request = store.openCursor();
      request.onsuccess = function() {
        var cursor = request.result;
        if (cursor) {
          chunks.push(cursor.value);
          cursor.continue();
        } else {
          saveAs('myfile', new Blob(chunks,
            {type: 'application/octet-stream'}));
        }
      };
    }
    
    // 3. Save into disk "saveAs()"
    function saveAs(filename, blob) {
      var a = document.documentElement.appendChild(document.createElement('a'));
      a.href = URL.createObjectURL(blob);
      a.download = filename;
      a.click();
      a.parentElement.remove(a);
    }
    </script>