web-dev-qa-db-fra.com

Écrire des données binaires en utilisant node.js fs.writeFile pour créer un fichier image

J'essaie d'écrire une donnée de toile avec node.js fs.writeFile en binaire. Fichier JPEG, mais une fois le fichier écrit, je peux voir que le fichier est stocké sous forme de texte brut, pas de données binaires.

Voici un exemple de data envoyé par le client à mon noeud, représentant les données d'image JPEG (quelques premiers caractères):

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAFA3PEY8MlBGQUZaVVBfeM...

Je reçois cette datadu côté client en effectuant:

canvas.toDataURL('image/jpeg', 0.5).replace('data:image/jpeg;base64,', '')

Voici l'utilisation de la fonction sur mon serveur node.js:

fs.writeFile('../some.jpeg', data, 'binary', function(err){});

Au lieu d'écrire le fichier sous forme binaire (״״ JFIF ...), il écrit exactement les données qu'il a reçues du client.

Qu'est-ce que je fais mal ici?

8
Koby Douek

JavaScript language n’avait aucun mécanisme pour lire ou manipuler des flux de données binaires. La classe Buffer a été introduite dans l'API Node.js pour permettre d'interagir avec les flux d'octets dans le contexte d'éléments comme les flux TCP et les opérations du système de fichiers.

javascript pur, bien qu’excellent avec les chaînes unicode-encoded, ne gère pas très bien les données binaires directes.

Lors de l'écriture de grandes quantités de données sur une socket, il est beaucoup plus efficace de disposer ces données au format binary, par opposition à la conversion de unicode.

var fs = require('fs');
// string generated by canvas.toDataURL()
var img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0"
    + "NAAAAKElEQVQ4jWNgYGD4Twzu6FhFFGYYNXDUwGFpIAk2E4dHDRw1cDgaCAASFOffhEIO"
    + "3gAAAABJRU5ErkJggg==";
// strip off the data: url prefix to get just the base64-encoded bytes
var data = img.replace(/^data:image\/\w+;base64,/, "");
var buf = new Buffer(data, 'base64');
fs.writeFile('image.png', buf);

Référence

21
Rayon

J'ai eu la question en question. J'ai résolu le problème en rendant la valeur par défaut null de "encoding" dans la bibliothèque "request" 

var request = require("request").defaults({ encoding: null });
var fs = require("fs");

fs.writeFile("./image.png", body, function(err) {
    if (err) throw err;
});
2
Yakup Ad