Запись двоичных данных с использованием node.js fs.writeFile для создания файла изображения

Я пытаюсь записать данные холста с помощью node.js fs.writeFile как двоичный файл Файл JPEG, но после того, как файл записан, я вижу, что файл хранится в виде обычного текста, а не двоичных данных.

Это пример data отправлено с клиента на мой узел, представляющий данные изображения JPEG (всего несколько первых символов):

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAFA3PEY8MlBGQUZaVVBfeM...

Я получаю это data на стороне клиента, выполнив:

canvas.toDataURL('image/jpeg', 0.5).replace('data:image/jpeg;base64,', '')

Вот использование функции на моем сервере node.js:

fs.writeFile('../some.jpeg', data, 'binary', function(err){});

Вместо того, чтобы файл записывался в двоичном виде (״״ JFIF ...), он записывает именно те данные, которые он получил от клиента.

Что я здесь не так делаю?

2 ответа

Решение

JavaScript язык не имел механизма для чтения или управления потоками двоичных данных. Buffer Класс был представлен как часть API-интерфейса Node.js, чтобы сделать возможным взаимодействие с потоками октетов в контексте таких вещей, как потоки TCP и операции файловой системы.

чистый javascriptв то время как отлично unicode-encoded строки, не очень хорошо обрабатывает прямые двоичные данные.

При записи больших объемов данных в socketгораздо эффективнее иметь эти данные в binary формат, против преобразования из 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);

Ссылка

У меня был вопрос в вопросе. Я решил проблему, установив значение по умолчанию null для "encoding" в библиотеке "request"

var request = require("request").defaults({ encoding: null });
var fs = require("fs");

fs.writeFile("./image.png", body, function(err) {
    if (err) throw err;
});

Использовать Buffer.from, в качестве Buffer устарел, появится следующее предупреждение

(узел:15707) [DEP0005] DeprecationWarning: Buffer() устарел из-за проблем с безопасностью и удобством использования. Используйте вместо них методы Buffer.alloc(), Buffer.allocUnsafe() или Buffer.from().

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 = Buffer.from(data, 'base64');
fs.writeFile('image.png', buf);

Вместо того, чтобы записывать файл непосредственно на ваш клиент, сначала попросите сервер отправить изображения в двоичном формате.

   let request= {
        headers: {
            'Content-Type': 'image/jpeg',
            'Authorization': "your token"
        },
        encoding:'binary'
    };
     request.get(url,request,(error, response, body)=>{
        if(error){
            console.log('error in get photo',error)
            return "default image to server";  
        }else{
            if(response.statusCode == 200){ 

      Fs.writeFile('path',body,'binary',function(err){
                    if(err){
                        return "your message";   
                    }else{
                        return "success";
                    }
                })
            }else{
                console.log('error in get photo 3')
                return "your message";  
            }
        }
    })
Другие вопросы по тегам