是否可以通过Javascript下载数据,然后通过文件路径引用该数据?

时间:2015-10-06 08:06:19

标签: javascript html5 browser cross-browser indexeddb

我想这样做:

  1. 通过Javascript从服务器下载数据(我知道我可以这样做)
  2. 将其存储在磁盘上(我知道我可以使用IndexedDB执行此操作)
  3. 将该数据引用为文件路径。 (例如:如果我下载一个mp3,我希望能够将它传递到HTML5音频标签中,因为" foo.mp3")
  4. #3可能吗?

    我知道我可以使用base64并制作数据URI,但这很慢并且(至少对于音频而言)似乎不适用于Android或iOS(我用纯HTML5测试过这个)音频标签和SoundManager2)。

    注意:我只对跨浏览器,跨平台解决方案感兴趣。

1 个答案:

答案 0 :(得分:1)

表面上你应该能够做到以下几点:

  • 从数据库中读取blob
  • 使用URL.createObjectURL()构建blob的URL
  • 将网址指定给audio元素
  • 可选:URL.revokeObjectURL()在不再需要时释放blob(例如,如果音频元素被赋予新URL)

例如:

<!DOCTYPE html>
<title>IndexedDB / Blob / URL Example</title>
<p>Select audio file here: <input type=file>
<p>Then play here: <audio controls></audio>
<script>
// When a file is selected...
document.querySelector('input[type="file"]').addEventListener('change', function(e) {
  var file = e.target.files[0];

  // Open the database connection.
  var open = indexedDB.open('blob-test');
  open.onupgradeneeded = function() {
    // Define the database schema if necessary.
    var db = open.result;
    var store = db.createObjectStore('files');
  };
  open.onsuccess = function() {
    var db = open.result;
    var key = 1;

    // Write file to DB
    var tx = db.transaction('files', 'readwrite');
    var store = tx.objectStore('files');
    store.put(file, key);

    // Later, read file back out of DB
    var tx2 = db.transaction('files');
    var store2 = tx2.objectStore('files');
    var request = store2.get(key);
    request.onsuccess = function(e) {
      // Got the file!
      var file = request.result;
      // Construct a URL for it
      var url = URL.createObjectURL(file);
      // Update audio element with the URL
      document.querySelector('audio').src = url;
    };
  };
});
</script>

..但你仍然想要到处测试。最近修复了一些错误。 Android上的Chrome会对此产生影响(例如https://crbug.com/227476

相关问题