使用browserify在javascript中读取二进制文件

时间:2013-07-09 06:53:43

标签: javascript browserify

我正在尝试使用browserify来访问本地二进制文件(也就是说,二进制文件与用户计算机中的javascript文件位于同一目录中)。 我没有成功。这是我尝试过的和我所知道的:

〜)我知道fs不会起作用...
0)我尝试使用require('html'),但它说'在这个浏览器中不支持ajax'[我正在使用铬......但我认为它与chrome大致相同]。

1)我尝试使用“browser-request”。这将二进制文件读取为字符串。  它基于'request'所以我应该能够配置选项,包括encoding:null,这可以解决我的所有问题,但是...查看source code,你会看到不存在对编码选项的支持。甚至没有警告。

2)我使用了xmlhttprequest,它需要'html'模块...所以再次,我得到与0相同的错误。奇怪的是,'浏览器请求'使用这个模块,它工作...我完全不知道为什么。

3)此时,我查看了html5文件系统支持。它会工作,但我不希望用户指定一个文件...因为我真的只想要缓冲区到内存。有没有其他方法来访问该文件?也许在启动铬时使用--allow-file-access?

4)如果所有其他方法都失败了,我只想要一种方法将缓冲区放入我的代码中。我想我可以在shell上使用node并将读取文件的结果复制粘贴到内存中......

有什么希望吗?

2 个答案:

答案 0 :(得分:1)

这有点有用:

function toArrayBuffer(buffer) {
  var ab = new ArrayBuffer(buffer.length);
  var view = new Uint8Array(ab);
  for (var i = 0; i < buffer.length; ++i) {
      view[i] = buffer[i];
  }
  return ab;
}


// node: readFileSync + toArrayBuffer
// browser: ajax http request
function readFile(filename, doneCb) {
  var isNode =
    typeof global !== "undefined" &&
    global.toString() == '[object global]';
  if (isNode) {
    var fs = require('fs');
    var buffer = fs.readFileSync(filename);
    buffer = toArrayBuffer(buffer);
    doneCb(buffer);
  } else {
    var http = require('http');
    var buf;
    var req = http.get({ path : '/'+ filename }, function (res) {
      res.on('data', function (chunk) {
        buf = chunk;
      });
      res.on('end', function () {
        doneCb(buf);
      });
    });
    req.xhr.responseType = 'arraybuffer';
  }
}

它需要一台服务器,而且我正在考虑如何让它在测试中发挥作用。

我能想到的另一种方法是使用带有base64编码的brfs:

var base64 = fs.readFileSync('file.bin', enc='base64');
var buf = new Buffer(base64, 'base64');
var ab = toArrayBuffer(buf);

它更简单,但它不是动态的,不能重构为自包含功能。

答案 1 :(得分:0)

如果不是动态使用brfs转换。