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 data
du 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?
JavaScript
language n’avait aucun mécanisme pour lire ou manipuler des flux de données binaires. La classeBuffer
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);
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;
});