2013-02-14 23 views
6

私はnodejを学びたいと思っています。これを行う最善の方法は、Expressやその他の非コアモジュールを使わずにいくつかのことをやってみることだと思いました。私はいくつかのテキストとイメージが同時に配信されるようにしようとしています。私がしようとしているコードがされていますので、理想的に配信されるべきものであるNodejs:同じレスポンス(テキストとイメージ)で異なるコンテンツタイプを返す方法は?

var http = require('http'); 
var fs = require('fs'); 

var server = http.createServer(function(request,response) { 

    fs.readFile('my_pic.jpg', function(error, file) { 
     response.writeHead(200, {'content-type':'text/html'}); 
     response.write('<p>hi there!</p>'); 

     response.writeHead(200, {'content-type':'image/jpg'}); 
     response.write(file, 'image'); 

     response.end(); 
    }); 

}); 

var port = process.env.PORT || 8080; 

server.listen(port, function() { 
    console.log('Listening on port ' + port); 
}); 

<html> 
<body> 
<p>hi there</p> 
<img src='my_pic.jpg'/> 
</body> 
</html> 

しかし、その代わりに、何も表示されていません。

私は、テキストを表示する 'hi there'を書き込んだ後でresponse.end()を入れてみました。その後、画像を表示したテキストと画像(ヘッダを含む)の場所を入れ替えようとしましたが、実際のWebページのように、両方を同時に表示する方法を理解することはできません。

さまざまな種類のコンテンツを同じWebページに配置する方法について説明できますか?異なる回答が必要ですか?何か私は別の質問に出くわした:

nodejs - How to read and output jpg image?

そのようなことが解決策のように見えますが、私は、私は多くの経験ではありません(私の状況にこれを適用する方法を見つけ出すことはできません物事のサーバー側)

感謝

EDIT:それはuser568109の応答から作業しました:

var http = require('http'); 
var fs = require('fs'); 


var server = http.createServer(function(request,response) { 
fs.readFile('my_pic.jpg', function(error, file) { 

    var imagedata = new Buffer(file).toString('base64'); 

    response.writeHead(200, {'content-type':'text/html'}); 
    response.write("hi there!<img src='data:my_pic.jpg;base64,"+imagedata+"'/>"); 
    response.end(); 

    }); 

}); 

var port = process.env.PORT || 8080; 

server.listen(port, function() { 
    console.log('Listening on port' + port); 
}); 

これは画像を埋め込む作業がたくさんあるようですが、複数の画像を入れたいのであれば、それらのファイルストリームのコールバックを入れ子にしておく必要があります。

私もそれをこのようにしようとしたが、それは動作しません:

var http = require('http'); 
var fs = require('fs'); 

var server = http.createServer(function(request,response) { 

    response.writeHead(200, {'content-type':'text/html'}); 
    response.write("hi there!<img src='my_pic.jpg'/>"); 
    response.end(); 

}); 

var port = process.env.PORT || 8080; 

server.listen(port, function() { 
    console.log('Listening on port' + port); 
}); 

私は、サーバーがdoesnのため、これはどのようなライン

response.write('<img src="my_pic.jpg"/>') 

、の意味人だったかどうかわかりませんでした私の代わりにイメージを取ってくるように別の要求をしているようだ?それは壊れたアイコンイメージを表示しているだけです。

+1

1つの応答に2つのHTTP要求を詰め込むように見えます。本当にあなたは 'response.write( '');を書いてください。そして、ブラウザはまずHTMLをダウンロードしてから、別のmy_pic.jpgをダウンロードするように要求します。 – codefactor

+0

マルチパートレスポンスを送信したいようです。私はブラウザがそれを扱うことができるかどうかわからない。答えはクライアント側で解析する必要があります。 – MaxArt

+0

可能な複製[node.jsを使用して複数の部分のHTTP応答を作成](http://stackoverflow.com/questions/11494209/construct-multi-part-http-response-using-node-js) – maerics

答えて

3

上記のようにresponse.write('<img src="my_pic.jpg"/>');を実行すると、ブラウザが画像をGETして送信した場合のみ、画像ファイルが送信されます。それは複数の部分からなる要求になります。

または、このようにすることができます。バイナリ形式でHTML形式で画像を送信することは可能です。使用:

<img src="data:image/gif;base64,imagedata"> 

ここでimagedataはgifイメージのbase64エンコードです。だから、Node.jsの中で次の操作を行います。ここ

//Write text in response. 
content = get-image-file-contents;  //store image into content 
imagedata = new Buffer(content).toString('base64'); //encode to base64 
response.write('<img src="data:image/gif;base64,'+imagedata+'">');//send image 
response.end(); 

チェック正しい画像変換NodeJS base64 image encoding/decoding not quite working

のためにこれは、テキストと画像の両方を送りつの応答を送信します。応答には1つのヘッダーのみが必要ですresponse.writeHead(200, {'content-type':'text/html'});

+0

こんにちはuser568109、私2番目のメソッドを使用してイメージを読み込み、そのコードを含めるように質問を編集しました。しかし、私はあなたの最初の方法を働かせる方法がわかりません - 私はあなたの編集した質問にコードを含めました。これはあなたが行の意味だったのでしょうか?response.write( '');?どうもありがとう。 – xdl

+0

最初は、HTMLページで使用する場合の例です。それが私がHTMLページ内に画像を埋め込む方法です。後者は、ノードで使用できるJavascriptコードです。 – user568109

1

与えられたヘッダーには1つの値しか書き込めないので、2番目のヘッダーは最初のヘッダーを上書きします。二つの溶液を

  1. は、HTML内の画像へのURLを書き出すれる - (画像を取得するための追加のHTTPリクエストを必要とする)ユーザのためにわずかに遅くなりますが、ユースケースに応じて、これは通常許容可能であると非常に簡単に実装する
  2. イメージをdata-uri文字列に変換し、これをイメージのソースとしてhtmlに含めます。最初のアプローチより実装が複雑(ノードでの変換を行うためのライブラリはわかりません)、無視できるメリットがあります。
関連する問題