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...
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
Vous devez vous connecter pour publier un commentaire.
D'enregistrer le fichier a été aussi facile que de créer un nouveau Tampon avec la Uint8Array objet :
OriginalL'auteur Karl.S
Bâtiment sur Karl.Réponse de S, cela a fonctionné pour moi, en dehors de tout cadre:
OriginalL'auteur toms
Voulais juste ajouter que dans les plus récents Meteor vous avez peut éviter de rappel de l'enfer avec
async/await
. Vous attendent également jeter et de pousser à l'erreur jusqu'à clientOriginalL'auteur Alex K