如何在HTML5 Blob对象上使用base64编码

时间:2015-01-19 19:34:03

标签: javascript html5 blob html5-filesystem

我正在构建一个库来“节点化”HTML5文件Api(目前在alpha中)[0],使其与二进制内容一起使用并且没有charsets的问题,我正在使用Buffer [1]效用

但HTML5文件API使用Blob本机对象。 Actualy我正在使用类型'application / octet-stream',以及来自Buffer编码的'binary'。但是,我想使用base64来防止出现任何问题:

CoFS.prototype.writeFile = function (fileName, data, encoding, callback) {

    var self = this;

    if (Buffer.isBuffer(data)) {
        callback = encoding;
        encoding = undefined;
    } else {
        data = new Buffer(data, encoding);
    }

    this._ifready(function () {

        self.getFileEntry(fileName, {create: true, exclusive: true}, function (err, fileEntry) {

            if (err) return callback(new Error("Error getting file access " + err.message));

            fileEntry.createWriter(function(fileWriter) {

                fileWriter.onwriteend = function () {
                    callback(null);
                };

                fileWriter.onerror = function(e) {
                    callback(new Error(e.toString()));
                };

                var blob = new Blob([data.toString('binary')], {type: 'application/octet-stream'});

                fileWriter.write(blob);

            }, function () {
                callback(new Error('Error writing ' + fileName));
            }); 
        });

    });

};

确切地说:

var blob = new Blob([data.toString('binary')], {type: 'application/octet-stream'});

我重新编写了MDN页面[2],但我没有看到有关编码的任何内容。

有没有办法完成类似的事情?:

var blob = new Blob([data.toString('base64')], {type: 'application/octet-stream', encoding: 'base64'});

三江源。

1 个答案:

答案 0 :(得分:4)

我意识到Buffer对象是从Int8Array扩展的,两者都是兼容的。

我的代码现在是:

var blob = new Blob(
    [data], // Data is a buffer!
    {
        type: 'application/octet-stream'
    }
);

fileWriter.write(blob);

为了阅读,我使用readAsArrayBuffer方法,你可以这样做:

var d = new Int8Array(arr); // When arr is arrayBuffer
var buf = new Buffer(d); // And works!

这解决了我的问题。对于转换base64编码的内容并在blob中使用,使用Buffer,可以是:

var blob = new Blob(
    [new Buffer(cleanData, 'base64')],
    {
        type: 'application/octet-stream'
    }
);