node.js fs.writeFile
でキャンバスのデータをバイナリで書き込もうとしています。JPEGファイルとして書き込もうとしているのですが、書き込んだ後、ファイルがバイナリデータではなく、プレーンテキストとして保存されていることがわかります。
これはクライアントから私のノードに送られた data
の例で、JPEG 画像データ (最初の数文字) を表しています。
9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAFA3PEY8MlBGQUZaVBfeM...`)
私は、この data
を クライアント側 で実行することによって得ています。
canvas.toDataURL('image/jpeg', 0.5).replace('data:image/jpeg;base64,', '')
以下は、私の node.js サーバー での関数の使用法です。
fs.writeFile('../some.jpeg', data, 'binary', function(err){});
ファイルをバイナリ(״ JFIF ...
)として書き出すのではなく、クライアントから受け取ったデータをそのまま書き出す。
何が間違っているのでしょうか?
JavaScript言語には、バイナリデータのストリームを読んだり操作したりするためのメカニズムがありませんでした。Node.js API の一部として導入された Buffer
クラスは、TCP ストリームやファイルシステム操作のようなコンテキストで、オクテットストリームを操作できるようにするためのものです。
純粋なJavaScriptは、Unicodeでエンコードされた文字列には優れていますが、ストレートなバイナリデータはあまりうまく扱えません。
ソケットに大量のデータを書き込む場合、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);
参考文献**をご参照ください。
**ファイルを直接クライアントに書き込むのではなく、まず、サーバーに送信を依頼します。 の画像をバイナリ形式で表示します。
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";
}
}
})