2016-11-16 6 views
0

私は最初のNode.js MVCアプリケーション(Expressを使用していないネイティブノード)を構築しており、相対パスを使ってHTMLファイルから画像を表示するのに問題があります。Node.jsの相対パスで画像を表示

私はここにあなたに私のserver.jsとrouter.jsコードを惜しま、しかしますが、基本的にはどのようにイムロード私の意見である私のコントローラのコードです:これは渡さ

var fs = require("fs"); 
var controller = require("controller"); 

var load_view = 'view_home'; 
var context = { foo : 'bar' }; 

controller.load_view(res, req, fs, load_view, context); 

に...

var url   = require('url'); 
var Handlebars = require('handlebars'); 

function load_view(res, req, fs, view, context, session){ 

    // Files to be loaded, in order 
    var files = [ 
     'view/elements/head.html', 
     'view/elements/header.html', 
     'view/' + view +'.html', 
     'view/elements/footer.html' 
    ];  

    // Start read requests, each with a callback that has an extra 
    // argument bound to it so it will be unshifted onto the callback's 
    // parameter list 
    for(var i=0; i<files.length; ++i) 
     fs.readFile(files[i], handler.bind(null, i)); 

    var count = 0; 

    function handler(index, err, content) { 

     // Make sure we don't send more than one response on error 
     if(count < 0) return; 
     if(err) { 
      count = -1; 
      console.log('Error for file: ' + files[index]); 
      console.log(err); 
      res.writeHead(500); 
      return res.end(); 
     } 

     // Reuse our `files` array by simply replacing filenames with 
     // their respective content 
     files[index] = content; 


     // Check if we've read all the files and write them in order if 
     // we are finished 
     if(++count===files.length) { 
      res.writeHead(200, { 'Content-Type': 'text/html' }); 
      for(var i = 0; i < files.length; ++i) { 

       var source = files[i].toString('utf8'); 

       // Handlebars 
       var template = Handlebars.compile(source); 
       var html = template(context); 

       res.write(html); /* WRITE THE VIEW (FINALLY) */ 

      } 
      res.end(); 
     } 

    } // handler() 

} // load() 

は最後に、ここではsrc属性でタグと相対パスと私のhtmlです:

<div class="help"> 

    <img src="../public/img/test.jpg" /> 

</div> 

マイFiの上記のようなファイルシステムは次のようになります:

相対パスが正しいと確信していますが、相対パスと絶対パスのすべての組み合わせを試しています。それでも、画像は表示されません。

LAMPの背景から来て、ファイルツリーの画像にアクセスするのは簡単ですが、私はそれが設定されていたので、ここではサーバの設定がはるかに異なっていることに気付きました。

ファイルシステム内の他のファイル(スタイルシートなど)にアクセスするには、ファイルを明示的にロードし、URIを使用してそのコントローラにアクセスする別のコントローラを作成します。しかし、この方法は不確定な数の画像に対しては実用的ではない。

&にアクセスするには、Node.jsを使用して画像をファイルシステムに表示するにはどうすればよいですか?

+1

node.jsはデフォルトでNOファイルを提供し、ファイルシステムは何もないことを理解していますか?そのため、ファイルシステムから提供されるすべてのイメージについて、httpサーバーのルートハンドラが適用されていることを確認する必要があります。静的ファイルとExpressのようなフレームワークを使用する場合、典型的に 'express.static()'を使用して、ハードドライブ上の特定のサブディレクトリ階層に特定のパス接頭辞を持つファイルを探すようにexpressに指示します。 – jfriend00

+1

そして、通常は相対パスを使用することは望ましくありません。なぜなら、それらのページのURLを基準にしているため、物事を単純化するよりも複雑なことが多いからです。より一般的には、 '/ public/img/test 'のようなものを使います。jpg'を使用していて、 '/ public'の接頭辞があるルートハンドラを使用して、特定のサブディレクトリ階層の残りのパスを探します。 – jfriend00

+1

そして、あなたがあなたの質問に表示するコードの多くは、エクスプレスとハンドルバーが持っている組み込みサポートを使用すると消えてしまいます。 – jfriend00

答えて

2

ファイルシステム内の他のファイル(スタイルシートなど)にアクセスするには、ファイルを明示的にロードしてURIを使用してそのコントローラにアクセスする別のコントローラを作成します。

コントローラが必要です。それでコードは、ブラウザが要求したURLを応答に変換します。

しかし、この方法は不確定な数の画像では実用的ではありません。

一般的なものを次に書きます。別のコントローラと一致しないURL、または特定のパスで始まるURL、または.jpgで終わるURL、またはURLに基​​づいてファイルパスに好きなロジックを変換します。

ファイルの内容を読み取って、適切なHTTPヘッダー(適切なコンテンツタイプを含む)とそれに続くデータを出力します。