Meu aplicativo Express está recebendo um PNG codificado em base64 do navegador (gerado a partir da tela com toDataURL ()) e gravando-o em um arquivo. Mas o arquivo não é um arquivo de imagem válido e o utilitário "arquivo" simplesmente o identifica como "dados".
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
fonte
fonte
<img src="data:image/png;base64,..." />
). Apenas uma opção a considerar para outras pessoas que usam este segmento como referência.Respostas:
Eu acho que você está convertendo os dados um pouco mais do que precisa. Depois de criar o buffer com a codificação adequada, você só precisa gravar o buffer no arquivo.
O novo Buffer (..., 'base64') converterá a string de entrada em um Buffer, que é apenas uma matriz de bytes, interpretando a entrada como uma string codificada em base64. Em seguida, você pode simplesmente escrever essa matriz de bytes no arquivo.
Atualizar
Como mencionado nos comentários,
req.rawBody
não é mais uma coisa. Se você estiver usandoexpress
/connect
, deverá usar obodyParser()
middleware e o uso ereq.body
, se estiver fazendo isso usando o Nó padrão, precisará agregar os objetos dedata
eventos recebidosBuffer
e fazer a análise dos dados dessa imagem noend
retorno de chamada.fonte
req.rawBody
contém os dados da solicitação que são codificados como um URL de dados: developer.mozilla.org/en-US/docs/data_URIs . Então você precisa retirar a parte inicial para obter apenas os dados da base64 para salvar.esta é a minha solução completa que lê qualquer formato de imagem base64 e o salva no formato apropriado no banco de dados:
fonte
ATUALIZAR
Encontrei este link interessante como resolver seu problema em PHP . Eu acho que você esqueceu de substituir
space
por,+
como mostrado no link.Peguei este círculo de http://images-mediawiki-sites.thefullwiki.org/04/1/7/5/6204600836255205.png como exemplo, que se parece com:
Em seguida, eu o coloquei em http://www.greywyvern.com/code/php/binary2base64, que me retornou:
salvei essa sequência na
base64
qual li no meu código.Recebo um círculo de volta, mas o engraçado é que o tamanho do arquivo mudou :)
FIM
Quando você lê a imagem, acho que você precisa configurar os cabeçalhos
Tomemos, por exemplo, imagepng da página PHP:
Acho que a segunda linha
header('Content-Type: image/png');
é importante, caso contrário sua imagem não será exibida no navegador, mas apenas um monte de dados binários é mostrado no navegador.No Express, você simplesmente usaria algo como abaixo. Vou exibir seu gravatar, que está localizado em http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG e é um arquivo jpeg quando você
curl --head http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG
. Só solicito cabeçalhos porque senão o curl exibirá um monte de coisas binárias (o Google Chrome baixará imediatamente) para o console:app.js
fonte
Também tive que salvar imagens codificadas em Base64 que fazem parte dos URLs de dados, então acabei criando um pequeno módulo npm para fazê-lo, caso eu (ou outra pessoa) precisasse fazê-lo novamente no futuro. Chama-se ba64 .
Simplificando, ele usa um URL de dados com uma imagem codificada em Base64 e salva a imagem no seu sistema de arquivos. Pode salvar de forma síncrona ou assíncrona. Ele também possui duas funções auxiliares, uma para obter a extensão do arquivo da imagem e a outra para separar a codificação Base64 do
data:
prefixo do esquema.Aqui está um exemplo:
Instalá-lo:
npm i ba64 -S
. O repositório está no GitHub: https://github.com/HarryStevens/ba64 .PS: Mais tarde, ocorreu-me que ba64 é provavelmente um nome ruim para o módulo, pois as pessoas podem presumir que ele codifica e decodifica Base64, o que não ocorre (existem muitos módulos que já fazem isso). Ah bem.
fonte
Isso fez isso por mim de forma simples e perfeita.
Excelente explicação de Scott Robinson
Da imagem para a sequência base64
Da base64 string para a imagem
fonte
Maneira fácil de converter a imagem base64 em arquivo e salvar como uma identificação ou nome aleatório.
fonte
Convertendo de arquivo com string base64 para imagem png.
4 variantes que funcionam.
fonte
Abaixo da função para salvar arquivos, basta passar seu arquivo base64, ele retorna o nome do arquivo e salva no DB.
fonte
Você pode usar uma biblioteca de terceiros como base64-img ou base64-to-image .
fonte