在对服务器使用字节范围请求时,如何在浏览器中处理二进制数据

时间:2015-04-13 07:49:52

标签: javascript browser binaryfiles binary-data

我正在试验受控文件请求。浏览器将使用字节范围请求从服务器获取大块文件。这可以是视频文件或某种大型数据文件。我已经能够使用request模块设置一个简单的提取来获取一系列数据。

request({
    url: 'http://localhost:8080' + file.path, 
    headers: {
        'Range' : 'bytes=0-50'
    }
}, function (err, res, body) {
    console.log('err: ', err);
    console.log('status: ', res.statusCode);
    console.log('body: ', body);
});

这会产生以下输出:

err:  null
status:  206
body:  ftypisomisomavc1.��moovlmvhdК{�К{

所以,我获取数据,但是我不确定处理这些二进制数据并保持其完整性的最佳方法。具体做法是:

  1. 将其作为二进制数据加载,以便我可以继续拼凑块并最终向用户提供可下载的文件。

  2. 对传入的数据执行某种类型的校验和或完整性检查(假设我可以获得每个块的md5,可能作为预取列表)。

1 个答案:

答案 0 :(得分:0)

事实证明,问题是由于我使用的next模块没有与本机浏览器XMLHttpRequest API接口,因此无法请求二进制数据。我创建了一个简单的小request函数,它包装XMLHttpRequest API并返回二进制数据(request)。

blob

并且可以像这样使用它:

function request (url, _opt, cb) {
    var xhr = new XMLHttpRequest();
    var opt = {
        method: 'GET'
    };
    if (typeof _opt === 'function') {
        cb = _opt;
    } else {
        opt = _opt;
    }
    opt.method = (opt.method) ? opt.method : 'GET';
    xhr.open(opt.method, url, true);
    xhr.responseType = 'blob';

    if (typeof opt.headers === 'object') {
        var keys = Object.keys(opt.headers);
        for (var i = 0, len = keys.length; i < len; i += 1) {
            xhr.setRequestHeader(keys[i], opt.headers[keys[i]]);
        }
    }

    xhr.onload = function (e) {
        if ((this.status >= 200) && (this.status < 299)) {
            // get binary data as a response
            cb(null, this, this.response);
        } else {
            cb('received error code: ' + this.status, this);
        }
    };

    xhr.send();
}