2016-10-29 15 views
1

現在、私はGETリクエストをサーバーに送信し、Webサイトから画像をダウンロードしてクライアントにデータを返すことを期待しています。ダウンロードした結果のデータをファイルに直接書き込むと、それが動作します。私はBufferオブジェクトを使用して、BASE64に変換して、それをクライアントに送信しようとするとtoString( 'base64')ノード内の無効な画像データが返される

app.get('/image', function(req, res) { 
    request("http://ipcam/auto.jpg", {encoding: 'binary'}, function(err, response, body) { 
     if (err) res.send(err); 
     fs.writeFile('logo ' + (Math.random() * 1000).toFixed(0) + '.jpeg', body, 'binary', function(err){ 
     if (err) throw err 
      console.log('File saved.') 
     }) 
     res.send(200); 
    }); 
}); 

しかし、imgタグが有効な画像データとしてそれを認識しません。これは、base64イメージデータのプレビューを表示するオンラインユーティリティを使用して確認されました。

サーバー:

res.send(new Buffer(body.replace(/(\r\n|\n|\r)/gm,""), 'binary').toString('base64')); 

クライアント:

var xmlHttp = new XMLHttpRequest(); 
     xmlHttp.onreadystatechange = function() { 
      if (xmlHttp.readyState == 4 && xmlHttp.status == 200 && xmlHttp.responseText != undefined) { 
       var base64string = xmlHttp.responseText.replace(/(\r\n|\n|\r)/gm,""); 
       document.getElementById('image').src = 'data:image/jpeg;base64,' + base64string; 
      } 
     }; 
     xmlHttp.open("GET", '/image', true); 
     xmlHttp.send(); 

編集:私は指摘したように、改行を削除正規表現を削除しました。しかしそれは助けにはならなかった。

現在のサーバー:

res.send(new Buffer(body, 'binary').toString('base64')); 

現在のクライアント:

var xmlHttp = new XMLHttpRequest(); 
     xmlHttp.onreadystatechange = function() { 
      if (xmlHttp.readyState == 4 && xmlHttp.status == 200 && xmlHttp.responseText != undefined) { 
       document.getElementById('image').src = 'data:image/jpeg;base64,' + xmlHttp.responseText; 
      } 
     }; 
     xmlHttp.open("GET", '/image', true); 
     xmlHttp.send(); 
+1

「body」は、JPEG画像のバイナリを表す場合、改行をテキストファイルのように置き換えるのはなぜですか?これらのバイトはイメージ内で重要です。 –

+0

あなたは正しいです。私は正規表現を削除しましたが、それはそれを修正しませんでした。キャッチをありがとう! – GPinskiy

答えて

1

{エンコーディング: 'バイナリ'}:ヌル代わりにあなたがバイナリデータとして応答を解釈する要求をしたい場合は

私の知る限り、あなたはエンコーディングを指定する必要があります。

(引用)

エンコーディング - 応答データのsetEncodingで使用するエンコード。 nullの場合、 ボディーはバッファーとして戻されます。他のもの(デフォルト値 の未定義値を含む)は、エンコードパラメータとしてtoString() (これはデフォルトで有効にutf8です)に渡されます。 (注:バイナリ データを期待する場合は、エンコーディングを設定する必要があります。null)を

あなただけを直接行うことができますので、あなたがそうあなたが応答に入る体が、すでにバッファに設定されますかしたら:

+0

うわー、うまくいった!ありがとう! – GPinskiy

0

ライン

res.send(new Buffer(body.replace(/(\r\n|\n|\r)/gm,""), 'binary').toString('base64')); 

はあまり意味がありません、あなたが送信しているバイナリを送信していません文字列。だから試してみる。

res.send(new Buffer(body).toString('base64')); 
+0

残念ながらそれは動作しませんでした。結果の文字列は、base64の他のイメージとはまったく違って見えますが、依然としてクライアント上に有効なイメージが表示されませんでした。 – GPinskiy

+0

編集をご覧ください。 – Fraser

+0

私は編集を参照してください。私がそれを変換する前に改行がそのままであっても、結果のデータは有効なイメージを作成しません。 – GPinskiy

関連する問題