【问题标题】:HTML5 IndexedDB - How to merge all records into oneHTML5 IndexedDB - 如何将所有记录合并为一个
【发布时间】:2014-07-15 18:52:22
【问题描述】:

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

  1. 存储到 IndexedDB 中的块。

  2. 下载所有chunk后,将所有记录合并为一个(如SQL SELECT * FROM XXX ...)。

  3. 保存到磁盘“saveAs()”或创建指向 IndexedDB 的 URL...

(或者有什么想法?)

我不知道如何执行第 2 步和第 3 步。

(以下是在数据库中存储 10,000 条记录的示例,步骤 2 后的预期输出应该是 SusanSusanSusanSusanSusan...)

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);
            }
        }     
    }
}

【问题讨论】:

  • 问:开发者最可怕的噩梦是什么?答:当您在寻找问题的解决方案时,您会发现 StackOverflow 问题与您正在寻找的内容完全相同。这个问题是一年前问的,还没有人回答!我不认为这是不可能的。 Mega.nz 已经实现了它。我仍在试图弄清楚他们是如何做到的。

标签: javascript html indexeddb savefiledialog chunks


【解决方案1】:
<!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>

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2017-02-24
    • 2015-04-23
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多