我正在尝试使用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并将读取文件的结果复制粘贴到内存中......
有什么希望吗?
答案 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转换。