3

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?

2
  • What do you mean by local? On the same domain? On the user's computer? Something else? Commented Jul 9, 2013 at 6:55
  • 1
    On the user's computer, on the same directory as the javascript that will use it and on the same directory as index.html,etc. Commented Jul 9, 2013 at 7:02

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

Comments

0

If it's not dynamic use brfs transform.

1 Comment

Still, it would be a string, not buffer. So all non-printable characters will be lost if the file is binary.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.