3

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

~) 我知道 fs 不起作用...
0) 我尝试使用 require('html') 但它说'此浏览器不支持 ajax' [我正在使用铬...但我认为它大致与铬相同的东西]。

1)我尝试使用“浏览器请求”。这会将二进制文件...作为字符串读取。它基于“请求”,所以我应该能够配置选项,包括编码:null,这将解决我所有的问题但是......查看源代码,你会发现不支持编码选项当下。甚至没有警告。

2)我使用了xmlhttprequest,它需要'html'模块......所以再次,我得到与0相同的错误)奇怪的是,'browser-request'使用这个模块并且它工作......我绝对没有知道为什么。

3)此时,我研究了html5文件系统支持。它会起作用,但我不希望用户指定一个文件......因为我真的只想将缓冲区放入内存。有没有其他方法可以访问该文件?也许在启动 chromium 时使用 --allow-file-access ?

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

有没有希望?

4

2 回答 2

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);

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

于 2014-01-30T18:07:24.203 回答
0

如果它不是动态的,请使用brfs转换。

于 2013-07-16T07:31:04.167 回答