Saya mencoba menulis data kanvas dengan node.js fs.writeFile
sebagai file biner. JPEG, tetapi setelah file ditulis, saya dapat melihat bahwa file tersebut disimpan sebagai teks biasa, bukan data biner.
Ini adalah contoh data
yang dikirim dari klien ke node saya, mewakili data gambar JPEG (hanya beberapa karakter pertama):
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAFA3PEY8MlBGQUZaVVBfeM...
Saya mendapatkan data
ini di sisi klien dengan melakukan:
canvas.toDataURL('image/jpeg', 0.5).replace('data:image/jpeg;base64,', '')
Berikut adalah penggunaan fungsi di server node.js saya:
fs.writeFile('../some.jpeg', data, 'binary', function(err){});
Alih-alih berkas ditulis sebagai biner (״״ JFIF ...
), ia menulis persis data yang diterima dari klien.
Apa yang saya lakukan salah di sini?
Bahasa JavaScript tidak memiliki mekanisme untuk membaca atau memanipulasi aliran data biner. Kelas Buffer
diperkenalkan sebagai bagian dari API Node.js untuk memungkinkan berinteraksi dengan aliran oktet dalam konteks hal-hal seperti aliran TCP dan operasi sistem file.
JavaScript murni, meskipun bagus dengan string yang dikodekan Unicode, tidak menangani data biner langsung dengan sangat baik.
Saat menulis data dalam jumlah besar ke soket, jauh lebih efisien untuk memiliki data tersebut dalam format biner vs harus mengkonversi dari 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);
Saya memiliki pertanyaan yang dimaksud. Saya memecahkan masalah ketika saya membuat nilai default null dari "encoding" di "request" library
var request = require("request").defaults({ encoding: null });
var fs = require("fs");
fs.writeFile("./image.png", body, function(err) {
if (err) throw err;
});
Daripada menulis file secara langsung ke klien Anda, pertama-tama, minta server untuk mengirim gambar dalam format biner.
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";
}
}
})