在Javascript中将Blob同步转换为base64字符串

时间:2014-12-03 11:37:09

标签: javascript json asynchronous base64 stringify

我发现base64编码数据Blob以将其放入JSON字符串的唯一方法是使用 asyncronous readAsDataUrl()函数。

var reader = new window.FileReader();
reader.readAsDataURL(blob); 
reader.onloadend = function() {
    base64data = reader.result;                
    console.log(base64data );
}

我的问题是我必须为JSON.stringify(object, replacer)使用同步替换函数来告诉它如何对Blob进行serieal化。

var replacer = function (key, value) {
    if (value instanceof Blob) {
        return blobToBase64(value);
    }
    return value;
}

如何将这两种(异步和同步)方法结合起来?

是否有更好的方法对这些数据进行base64编码同步

1 个答案:

答案 0 :(得分:0)

应该有一个同步 API来读取文件 - FileReaderSync。它的文档说明如下:

  

8.6读取线程

     

Web Workers允许使用同步文件或Blob读取API,因为这样的读取   在线程上不会阻塞主线程。本节定义了一个同步API,
  可以在工人[Web Workers]中使用   工作人员可以利用异步API(FileReader对象)和同步API   (FileReaderSync对象)。

Web Workers的文档可通过上面的引文中的链接获得。尽管我不熟悉Web Workers API,但上面提到的文档提供了格式良好的简单示例,这些示例创建了一个足够直观的API的印象,可以快速开始使用它。

我没有测试这个,但这里是我会重写你的snipet代码:

var jsonfyObjectWhichMightBeABlob = function(obj){
    var worker = new Worker('jsonfyBlobSynchroniously.js');
    worker.onmessage = function (event) {
        return event.data;
        //or do something with event.data wich should contain the JSON string
    };
    worker.postMessage(obj);
};  

jsonfyBlobSynchroniously.js应包含以下内容:

onmessage = function (event) {
    var replacer = function(key,value){
        if(value instanceof Blob){
            var reader = new window.FileReaderSync();
            return reader.readAsDataURL(value);
        }else{
            return value;
        }
    }
    postMessage( JSON.stringify(event.data,replacer) );
};