5

我在 Dart 的客户端/服务器上找到了一些不错的教程。客户端只是通过指定端口上的 localhost 向服务器发出请求,服务器只是用一个字符串响应。

但是,我没有找到有关如何提供图像的任何帮助。我希望能够让服务器将图像服务器发送给客户端。例如,如果客户端发出类似: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);
});
}

我还没有实现客户端,但是有必要实现客户端吗?浏览器还不够客户端吗?

另外,我需要做什么才能使服务器提供图像?

4

2 回答 2

5

我已经粘贴了您的代码(并稍微编辑了它,我认为有几个错别字),它确实提供了 chrome 中的图像 - 目前,您必须传递图像的完整 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 的评论也是正确的 - 您还应该添加正确的标题(尽管 chrome 似乎非常擅长解释没有正确标题的内容)。

作为参考,这是对我来说很好的服务器端代码(只是为了测试它...... - 删除了 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(".");  
}
于 2012-12-13T01:56:41.977 回答
1

To properly serve images, you're going to need to set a Content-Type header. Other than that, the code you have is going in the right direction because it can already serve files. On the other hand, it might be easier to use Apache or Nginx and then setup a reverse proxy to the Dart server. That way Apache or Nginx can serve static files for you. Sorry, we don't yet have all of this documented yet. I also wonder if using Heroku might be a good fit for you.

于 2012-12-12T23:31:49.853 回答