使用Browserify在JavaScript中读取二进制文件

3
我正在尝试使用browserify访问本地二进制文件(即,二进制文件与JavaScript文件在同一目录中,且位于用户计算机中)。 我尝试过但没有成功。以下是我的尝试和所了解到的信息:
~) 我知道fs不起作用... 0) 我尝试使用require('html'),但它显示“此浏览器不支持ajax”[我正在使用chromium...但我认为它与chrome差不多]。
1) 我尝试使用'browser-request'。这会将二进制文件读取为字符串。 它基于'request',因此我应该能够配置选项,包括编码:null,这将解决我所有的问题,但是...查看源代码,您会发现没有支持编码选项。甚至没有警告。

2) 我使用了xmlhttprequest,需要“html”模块...所以我再次遇到了与0)相同的错误。奇怪的是,“browser-request”使用了这个模块,而且它可以工作...但我绝对不知道为什么。

3) 在这一点上,我研究了html5文件系统支持。它可以工作,但我不想让用户指定一个文件...因为我真的只想把缓冲区读入内存。有没有其他方法来访问文件?也许在启动Chromium时使用“--allow-file-access”?

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

还有希望吗?


“local” 是什么意思?是指在同一域名下吗?还是指在用户的计算机上?还是其他什么地方? - user2357112
1
在用户计算机上,与将使用它的JavaScript文件以及index.html等文件位于同一目录中。 - ldd
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';
  }
}

需要一个服务器,我正在努力让它在testling上运行。
我能想到的另一种方法是使用带有base64编码的brfs:
var base64 = fs.readFileSync('file.bin', enc='base64');
var buf = new Buffer(base64, 'base64');
var ab = toArrayBuffer(buf);

虽然它更简单,但不够动态化,也无法重构为自包含函数。


0

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


但它仍将是一个字符串,而不是缓冲区。因此,如果文件是二进制的,则所有不可打印字符都将丢失。 - Vanuan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接