Comment écrire un fichier à partir d'un ArrayBuffer en JS

Je suis en train d'écrire un fichier uploader pour Meteor cadre.
Le principe est de séparer le fileon le client à partir d'une ArrayBuffer dans des petits paquets de 4096 bits qui sont envoyées au serveur par l'intermédiaire d'un Météore.méthode.

La simplifié code ci-dessous est la part du client qui envoie un morceau pour le serveur, il est répété jusqu'à ce que décalage atteint de données.byteLength :

//data is an ArrayBuffer
var total = data.byteLength;
var offset = 0;

var upload = function() {
  var length = 4096; //chunk size

  //adjust the last chunk size
  if (offset + length > total) {
     length = total - offset;
  }

  //I am using Uint8Array to create the chunk
  //because it can be passed to the Meteor.method natively
  var chunk = new Uint8Array(data, offset, length);

  if (offset < total) {
     //Send the chunk to the server and tell it what file to append to
     Meteor.call('uploadFileData', fileId, chunk, function (err, length) {
        if (!err) {
          offset += length;
          upload();
        }
     }
  }
};
upload(); //start uploading

La simplifié code ci-dessous est la partie sur le serveur qui reçoit le morceau et l'écrit dans le fichier système :

var fs = Npm.require('fs');
var Future = Npm.require('fibers/future');

Meteor.methods({
  uploadFileData: function(fileId, chunk) {
    var fut = new Future();
    var path = '/uploads/' + fileId;

    //I tried that with no success
    chunk = String.fromCharCode.apply(null, chunk);

    //how to write the chunk that is an Uint8Array to the disk ?
    fs.appendFile(path, chunk, 'binary', function (err) {
      if (err) {
        fut.throw(err);
      } else {
        fut.return(chunk.length);
      }
    });
    return fut.wait();
  }
});

Je n'ai pas réussi à écrire un fichier valide pour le disque, en fait le fichier est enregistré mais je ne peux pas l'ouvrir, quand je vois le contenu dans un éditeur de texte, il est semblable à l'original de fichier (jpg par exemple), mais certains personnages sont différents, je pense que ça pourrait être un problème d'encodage que la taille du fichier n'est pas le même, mais je ne sais pas comment le corriger...

vous pouvez passer d'une tache à la place? ils viennent généralement dans le nœud tampon, qui fs.AppendFile() poignées.
En fait vous m'avez donné la moitié de la réponse, voir la solution est simple, après tout, je vous Remercie !

OriginalL'auteur Karl.S | 2015-07-23