Запись двоичных данных с помощью node.js fs.writeFile для создания файла изображения
Я пытаюсь записать данные холста с помощью node.js fs.writeFile
в виде двоичного 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...
), он записывает именно те данные, которые он получил от клиента.
Что я здесь не так делаю?
Ответы
Ответ 1
Язык 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);
Ссылка
Ответ 2
У меня был вопрос в вопросе. Я решил проблему, установив значение по умолчанию 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;
});
Ответ 3
Вместо того, чтобы записывать файл непосредственно на ваш клиент, сначала попросите сервер отправить изображения в двоичном формате.
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";
}
}
})