Mi aplicación Express está recibiendo un PNG codificado en base64 del navegador (generado a partir del lienzo con toDataURL ()) y lo está escribiendo en un archivo. Pero el archivo no es un archivo de imagen válido, y la utilidad "archivo" simplemente lo identifica como "datos".
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
fuente
fuente
<img src="data:image/png;base64,..." />
). Solo es una opción a considerar para otros que usan este hilo como referencia.Respuestas:
Creo que está convirtiendo los datos un poco más de lo necesario. Una vez que cree el búfer con la codificación adecuada, solo necesita escribir el búfer en el archivo.
El nuevo Buffer (..., 'base64') convertirá la cadena de entrada en un Buffer, que es solo una matriz de bytes, interpretando la entrada como una cadena codificada en base64. Luego puede escribir esa matriz de bytes en el archivo.
Actualizar
Como se menciona en los comentarios,
req.rawBody
ya no es una cosa. Si está usandoexpress
/connect
, debe usar elbodyParser()
middleware y usarreq.body
, y si está haciendo esto usando el Nodo estándar, entonces necesita agregar los objetos dedata
eventos entrantesBuffer
y analizar esta información de la imagen en laend
devolución de llamada.fuente
req.rawBody
contiene los datos de solicitud que están codificados como URL de datos: developer.mozilla.org/en-US/docs/data_URIs . Por lo tanto, debe quitar la parte inicial para obtener solo los datos de base64 para guardar.Esta es mi solución completa que leería cualquier formato de imagen base64 y lo guardaría en el formato adecuado en la base de datos:
fuente
ACTUALIZAR
Encontré este interesante enlace sobre cómo resolver su problema en PHP . Creo que se olvidó de reemplazar
space
por+
como se muestra en el enlace.Tomé este círculo de http://images-mediawiki-sites.thefullwiki.org/04/1/7/5/6204600836255205.png como muestra que se parece a:
Luego lo puse a través de http://www.greywyvern.com/code/php/binary2base64 que me devolvió:
guardé esta cadena en la
base64
que leí en mi código.Me devuelve un círculo, pero lo curioso es que el tamaño del archivo ha cambiado:) ...
FINAL
Cuando lees la imagen, creo que necesitas configurar los encabezados
Tome por ejemplo imagepng de la página PHP:
Creo que la segunda línea
header('Content-Type: image/png');
es importante; de lo contrario, su imagen no se mostrará en el navegador, sino que solo se mostrarán un montón de datos binarios en el navegador.En Express , simplemente usaría algo como a continuación. Voy a mostrar su gravatar que se encuentra en http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG y es un archivo jpeg cuando usted
curl --head http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG
. Solo solicito encabezados porque, de lo contrario, curl mostrará un montón de cosas binarias (Google Chrome va a descargar inmediatamente) a la consola:app.js
fuente
También tuve que guardar las imágenes codificadas en Base64 que son parte de las URL de datos, así que terminé haciendo un pequeño módulo npm para hacerlo en caso de que yo (u otra persona) tuviera que volver a hacerlo en el futuro. Se llama ba64 .
En pocas palabras, toma una URL de datos con una imagen codificada en Base64 y guarda la imagen en su sistema de archivos. Se puede guardar de forma sincrónica o asincrónica. También tiene dos funciones auxiliares, una para obtener la extensión del archivo de la imagen y la otra para separar la codificación Base64 del
data:
prefijo del esquema.Aquí hay un ejemplo:
Instalarlo:
npm i ba64 -S
. Repo está en GitHub: https://github.com/HarryStevens/ba64 .PD: Más tarde se me ocurrió que ba64 es probablemente un mal nombre para el módulo, ya que la gente puede suponer que codifica y decodifica Base64, lo que no hace (hay muchos módulos que ya lo hacen). Oh bien.
fuente
Esto lo hizo por mí simple y perfectamente.
Excelente explicación de Scott Robinson
De imagen a cadena base64
De cadena base64 a imagen
fuente
Manera fácil de convertir la imagen base64 en archivo y guardarla como una identificación o nombre aleatorio.
fuente
Conversión de archivo con cadena base64 a imagen png.
4 variantes que funcionan.
fuente
Debajo de la función para guardar archivos, simplemente pase su archivo base64, devolverá el nombre del archivo y guárdelo en la base de datos.
fuente
Puede usar una biblioteca de terceros como base64-img o base64-to-image .
fuente