web-dev-qa-db-ja.com

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,', '')

Mynode.js serverでの関数の使用法は次のとおりです。

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

ファイルがバイナリ(״״ JFIF ...)、クライアントから受信したデータを正確に書き込みます。

ここで何が間違っていますか?

11
Koby Douek

JavaScript言語には、バイナリデータのストリームを読み取ったり操作したりするメカニズムがありませんでした。 Bufferクラスは、Node.js APIの一部として導入され、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);

参照

28
Rayon

質問がありました。 「request」ライブラリで「encoding」のデフォルト値をnullにしたときに問題を解決しました

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

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

クライアントにファイルを直接書き込む代わりに、最初にサーバーにバイナリ形式で画像を送信するように依頼します。

   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";  
            }
        }
    })
0
Piush Singh