2012-12-12 15 views
5

私はダーツのクライアント/サーバーでいくつかの素晴らしいチュートリアルを見つけました。クライアントは指定されたポートのlocalhostを介してサーバーに要求を行い、サーバーはStringで応答します。ダーツのクライアントサーバー

しかし、私は画像を提供する方法について助けを見つけませんでした。私は、サーバーイメージをクライアントに送ることができるようにしたい。たとえば、クライアントが localhost:1313/Imagesのような要求を行う場合、サーバは "images"フォルダにあるすべての画像を表示するページで応答する必要があります。ここで

は、私がこれまで持っているコードです:

import 'dart:io'; 

class Server { 

_send404(HttpResponse res){ 
    res.statusCode = HttpStatus.NOT_FOUND; 
    res.outputStream.close(); 
} 


void startServer(String mainPath){ 
HttpServer server = new HttpServer(); 
server.listen('localhost', 1111); 
print("Server listening on localhost, port 1111"); 

server.defaultRequestHandler = (var req, var res) { 
    final String path = req.path == '/' ? '/index.html' : req.path; 
    final File file = new File('${mainPath}${path}'); 

    file.exists().then((bool found) { 
    if(found) { 
     file.fullPath().then((String fullPath) { 
     if(!fullPath.startsWith(mainPath)) {    
      _send404(res); 
     } else { 
      file.openInputStream().pipe(res.outputStream); 
     } 
     }); 
    } else { 
     _send404(res); 
    } 
    }); 
}; 


void main(){ 
Server server = new Server(); 
File f = new File(new Options().script); 
f.directory().then((Directory directory) { 
server.startServer(directory.path); 
}); 
} 

私はまだクライアントを実装していないが、それは、クライアントを実装する必要があるのでしょうか?ブラウザはクライアントとして十分ではありませんか?

また、サーバーでイメージを配信するにはどうすればよいですか?

+0

画像ファイル名や画像自体のリストを表示したいですか?後者の場合、何らかのHTMLテンプレートを実行する必要があります。 – tjameson

答えて

1

イメージを正しく配信するには、Content-Typeヘッダーを設定する必要があります。それ以外にも、あなたが持っているコードは、既にファイルを提供できるので正しい方向に進んでいます。一方、ApacheやNginxを使用してDartサーバーにリバースプロキシを設定する方が簡単かもしれません。そうすれば、ApacheやNginxがあなたのために静的ファイルを提供することができます。申し訳ありませんが、私たちはまだこれのすべてを文書化していません。私はHerokuを使用することがあなたに適しているかどうかも疑問です。

+0

返事をありがとう。 私はhtmlページを作ったが、実際に言うべきではない。 。これにより、単一のイメージへの参照が作成されますが、サーバー上のすべてのイメージを表示する必要があります。それは、それぞれの画像に対して 'img src = ""'を使ってdiv/spanを作成しなければならないということですか? あり私の全体のhtmlページのコードのためのスペースはありませんが、それはおおよそ次のようになります。

Excercise4


私はクライアントとサーバーの両方のためにダーツを使用しなければなりません。サーバーはローカルのみです – AomSet

+0

これは一般的にHTMLの場合と同じです。各画像にはのタグを含むHTMLが必要です。あなたがApacheなどを使うときだけです。それらのWebサーバーは、それらのHTMLページを生成することができます。実際にDartサーバーを使用する場合は、ディレクトリ内の画像をループするコードを記述し、各画像にというタグを持つHTMLページを生成する必要があります。 –

5

私はあなたのコードを貼り付けました(少し編集しましたが、いくつかのタイプミスがあると思います)。そして、それはクロムの画像を提供します。現在、画像の完全なURLを渡す必要があります。画像の完全なページを取得するにはhttp://localhost:1111/images/foo.png

、あなたが例えば、HTMLページを記述する必要があり、次のいずれか

<html><body> 
    <img src="http://localhost:1111/images/foo.png"/> 
    <img src="http://localhost:1111/images/bar.png"/> 
</body></html> 

そして、あなたがのために、サーバ上で動的にHTMLを作成できない理由はありません例えば、images.htmlと呼ばれるファイルの要求に応答して、 DirectoryListerクラスを見て、サーバー側のファイルとフォルダを反復処理します。

また、JJのコメントも正しいです。適切なヘッダーを追加する必要があります(ただし、クロムは正しいヘッダーがないと解釈するのにはかなり良いようです)。

私のためにうまく動作するサーバー側のコードはここにあります(テストできるように... - 404とオプションが削除されています - 現在の(つまり自分のアプリケーションの)フォルダから提供されています)。

import 'dart:io'; 

void startServer(String mainPath){ 
    HttpServer server = new HttpServer(); 
    server.listen('127.0.0.1', 1111); 
    print("Server listening on localhost, port 1111"); 

    server.defaultRequestHandler = (var req, var res) { 
    final String path = req.path == '/' ? '/index.html' : req.path; 
    final File file = new File('${mainPath}${path}'); 

    file.exists().then((bool found) { 
     if(found) { 
     file.fullPath().then((String fullPath) { 
      file.openInputStream().pipe(res.outputStream); 
     }); 
     } 
    });  
    }; 
} 

main(){ 
    startServer("."); 
} 
関連する問題