Mon application Express reçoit un PNG encodé en base64 du navigateur (généré à partir du canevas avec toDataURL ()) et l'écrit dans un fichier. Mais le fichier n'est pas un fichier image valide, et l'utilitaire "fichier" l'identifie simplement comme "données".
var body = req.rawBody,
base64Data = body.replace(/^data:image\/png;base64,/,""),
binaryData = new Buffer(base64Data, 'base64').toString('binary');
require("fs").writeFile("out.png", binaryData, "binary", function(err) {
console.log(err); // writes out file without error, but it's not a valid image
});
image
node.js
base64
binaryfiles
Mahemoff
la source
la source
<img src="data:image/png;base64,..." />
). Juste une option à considérer pour les autres utilisant ce fil de discussion comme référence.Réponses:
Je pense que vous convertissez les données un peu plus que nécessaire. Une fois que vous avez créé le tampon avec le codage approprié, il vous suffit d'écrire le tampon dans le fichier.
new Buffer (..., 'base64') convertira la chaîne d'entrée en Buffer, qui n'est qu'un tableau d'octets, en interprétant l'entrée comme une chaîne encodée en base64. Ensuite, vous pouvez simplement écrire ce tableau d'octets dans le fichier.
Mettre à jour
Comme mentionné dans les commentaires, ce
req.rawBody
n'est plus une chose. Si vous utilisezexpress
/,connect
vous devez utiliser lebodyParser()
middleware et utiliserreq.body
, et si vous le faites à l'aide de Node standard, vous devez regrouper les objets d'data
événements entrantsBuffer
et effectuer cette analyse des données d'image dans leend
rappel.la source
req.rawBody
contient les données de la requête qui sont encodées en tant qu'URL de données: developer.mozilla.org/en-US/docs/data_URIs . Vous devez donc supprimer la partie de début pour obtenir uniquement les données base64 à enregistrer.c'est ma solution complète qui lit n'importe quel format d'image base64 et l'enregistre au format approprié dans la base de données:
la source
METTRE À JOUR
J'ai trouvé ce lien intéressant pour résoudre votre problème en PHP . Je pense que vous avez oublié de remplacer
space
par+
comme indiqué dans le lien.J'ai pris ce cercle de http://images-mediawiki-sites.thefullwiki.org/04/1/7/5/6204600836255205.png comme exemple qui ressemble à:
Ensuite, je l'ai mis sur http://www.greywyvern.com/code/php/binary2base64 qui m'a renvoyé:
a enregistré cette chaîne dans
base64
laquelle j'ai lu dans mon code.Je récupère un cercle, mais le plus drôle est que la taille du fichier a changé :) ...
FIN
Lorsque vous relisez l'image, je pense que vous devez configurer les en-têtes
Prenez par exemple imagepng de la page PHP:
Je pense que la deuxième ligne
header('Content-Type: image/png');
est importante sinon votre image ne sera pas affichée dans le navigateur, mais juste un tas de données binaires est montré au navigateur.Dans Express, vous utiliseriez simplement quelque chose comme ci-dessous. Je vais afficher votre gravatar qui se trouve à http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG et est un fichier jpeg lorsque vous
curl --head http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG
. Je ne demande que des en-têtes car sinon curl affichera un tas de trucs binaires (Google Chrome va immédiatement télécharger) sur la console:app.js
la source
J'ai également dû enregistrer des images encodées en Base64 qui font partie des URL de données, alors j'ai fini par créer un petit module npm pour le faire au cas où je (ou quelqu'un d'autre) aurait besoin de le refaire à l'avenir. Il s'appelle ba64 .
En termes simples, il prend une URL de données avec une image encodée en Base64 et enregistre l'image dans votre système de fichiers. Il peut enregistrer de manière synchrone ou asynchrone. Il dispose également de deux fonctions d'assistance, l'une pour obtenir l'extension de fichier de l'image et l'autre pour séparer l'encodage Base64 du
data:
préfixe du schéma.Voici un exemple:
Installez - le:
npm i ba64 -S
. Repo est sur GitHub: https://github.com/HarryStevens/ba64 .PS Il m'est apparu plus tard que ba64 est probablement un mauvais nom pour le module car les gens peuvent supposer qu'il fait l'encodage et le décodage Base64, ce qui n'est pas le cas (il y a beaucoup de modules qui le font déjà). Tant pis.
la source
Cela l'a fait pour moi simplement et parfaitement.
Excellente explication par Scott Robinson
De l'image à la chaîne base64
De la chaîne base64 à l'image
la source
Un moyen facile de convertir une image base64 en fichier et de l'enregistrer sous un identifiant ou un nom aléatoire.
la source
Conversion d'un fichier avec une chaîne base64 en image png.
4 variantes qui fonctionnent.
la source
Ci-dessous la fonction pour enregistrer les fichiers, passez simplement votre fichier base64, il renvoie le nom de fichier, enregistrez-le dans la base de données.
la source
Vous pouvez utiliser une bibliothèque tierce telle que base64-img ou base64-to-image .
la source