reading a binary file in javascript using browserify

▼魔方 西西 提交于 2019-12-23 16:31:40

问题


I am trying to use browserify to access a local binary file (that is, the binary file is in the same directory as the javascript file, which is in the user's computer). I haven't succeeded. Here's what I tried and what I know:

~) I know fs won't work...
0) I tried using the require('html') but it says 'ajax not supported in this browser' [I am using chromium... but I'd assume it's roughly the same thing as chrome].

1) I tried using 'browser-request'. This reads the binary file... as a string. It is based on 'request' so I should be able to configure the options, including encoding: null, which would solve all my problems but...looking at the source code, you'll see that no support for the encoding option is present. Not even a warning.

2) I used xmlhttprequest, which required the 'html' module... so again, I get the same error as in 0) Strangely enough, 'browser-request' uses this module and it works... and I have absolutely no idea why.

3) At this point, I looked into html5 file system support. It would work but I don't want the user to specify a file... seeing as I really ONLY want to get the buffer to memory. Is there any other way to access the file? Perhaps using --allow-file-access when starting chromium?

4) If all else fails, I just want a way to get the Buffer into my code. I guess I could just use node on shell and copy paste the result of reading the file into memory...

Is there any hope at all?


回答1:


Here's what somewhat works:

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';
  }
}

It requires a server and I'm strugging with on how to make it work in testling.

Another approach I can think of is to use brfs with base64 encoding:

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

It is simpler, but it is not dynamic and cannot be refactored to self-contained function.




回答2:


If it's not dynamic use brfs transform.



来源:https://stackoverflow.com/questions/17541845/reading-a-binary-file-in-javascript-using-browserify

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!