Приложение My Express получает PNG-кодировку в формате base64 из браузера (сгенерированную из canvas с помощью toDataURL ()) и записывает ее в файл. Но файл не является допустимым файлом изображения, а утилита «файл» просто определяет его как «данные».
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
источник
источник
<img src="data:image/png;base64,..." />
). Просто возможность рассмотреть для других, используя эту тему в качестве ссылки.Ответы:
Я думаю, что вы конвертируете данные немного больше, чем нужно. Как только вы создадите буфер с правильной кодировкой, вам просто нужно записать буфер в файл.
new Buffer (..., 'base64') преобразует входную строку в Buffer, который является просто массивом байтов, интерпретируя входные данные как строку в кодировке base64. Затем вы можете просто записать этот байтовый массив в файл.
Обновить
Как уже упоминалось в комментариях,
req.rawBody
это уже не вещь. Если вы используетеexpress
/,connect
то вы должны использоватьbodyParser()
промежуточное программное обеспечение и использоватьreq.body
, а если вы делаете это с использованием стандартного узла, то вам нужно агрегировать объекты входящихdata
событийBuffer
и выполнять анализ данных этого изображения вend
обратном вызове.источник
req.rawBody
содержит данные запроса, которые закодированы в виде URL-адреса данных: developer.mozilla.org/en-US/docs/data_URIs . Таким образом, вы должны удалить начальную часть, чтобы получить только данные base64 для сохранения.Это мое полное решение, которое будет читать любой формат изображения base64 и сохранять его в нужном формате в базе данных:
источник
ОБНОВИТЬ
Я нашел эту интересную ссылку, как решить вашу проблему в PHP . Я думаю, что вы забыли заменить
space
на,+
как показано в ссылке.Я взял этот круг из http://images-mediawiki-sites.thefullwiki.org/04/1/7/5/6204600836255205.png в качестве образца, который выглядит следующим образом:
Затем я вставил его через http://www.greywyvern.com/code/php/binary2base64, который вернул меня:
сохранил эту строку, из
base64
которой я прочитал в моем коде.Я получаю круг обратно, но забавно то, что размер файла изменился:) ...
КОНЕЦ
Когда вы читаете обратно изображение, я думаю, что вам нужно настроить заголовки
Взять, к примеру, imagepng со страницы PHP:
Я думаю, что вторая строка
header('Content-Type: image/png');
важна, иначе ваше изображение не будет отображаться в браузере, а просто бинарная информация отображается в браузере.В Express вы просто используете что-то вроде ниже. Я собираюсь показать ваш граватар, который находится по адресу http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG и является файлом jpeg, когда вы
curl --head http://www.gravatar.com/avatar/cabf735ce7b8b4471ef46ea54f71832d?s=32&d=identicon&r=PG
. Я запрашиваю только заголовки, потому что в противном случае curl будет отображать кучу бинарных файлов (Google Chrome сразу же перейдет к загрузке) на консоль:app.js
источник
Мне также пришлось сохранять изображения в кодировке Base64, являющиеся частью URL-адресов данных, поэтому я сделал небольшой модуль npm для этого на тот случай, если мне (или кому-то еще) понадобится сделать это снова в будущем. Это называется ba64 .
Проще говоря, он берет URL-адрес данных с изображением в кодировке Base64 и сохраняет изображение в вашей файловой системе. Это может сохранить синхронно или асинхронно. Он также имеет две вспомогательные функции: одна для получения расширения файла изображения, а другая для отделения кодировки Base64 от
data:
префикса схемы.Вот пример:
Установите его:
npm i ba64 -S
. Репо находится на GitHub: https://github.com/HarryStevens/ba64 .Позже мне пришло в голову, что ba64 - это, вероятно, плохое имя для модуля, поскольку люди могут предположить, что он выполняет кодирование и декодирование Base64, а это не так (есть много модулей, которые уже делают это). Ну что ж.
источник
Это сделало это для меня просто и идеально.
Отличное объяснение Скотта Робинсона
От изображения к строке base64
От строки base64 к изображению
источник
Простой способ преобразовать изображение base64 в файл и сохранить его в виде произвольного идентификатора или имени.
источник
Преобразование из файла со строкой base64 в изображение PNG.
4 варианта, который работает.
источник
Ниже функция сохранения файлов, просто передайте файл base64, он возвращает имя файла и сохраняет его в БД.
источник
Вы можете использовать стороннюю библиотеку, такую как base64-img или base64-to-image .
источник