【问题标题】:Stream image file to HttpResponse efficiently有效地将图像文件流式传输到 HttpResponse
【发布时间】:2014-04-27 01:58:31
【问题描述】:

我的服务器端 Dart Web 应用为某些请求提供图像文件。

简而言之,这是它目前所做的:

   HttpServer.bind(InternetAddress.ANY_IP_V4, 80)
    .then((HttpServer server) {    
      server.listen((HttpRequest request) {      
        request.response.statusCode = HttpStatus.OK;
        request.response.headers.contentType = ContentType.parse("image/jpg");
        var file = new File("C:\\images\\myImage.jpg");
        file.readAsBytes().then((List<int> bytes) {
          bytes.forEach((int b) => request.response.writeCharCode(b)); // slow!
          request.response.close();       
        });    
      }
   }

这可行,但速度相当慢,我怀疑通过 HttpResponse.writeCharCode 单独写入每个字节是这里放慢速度的原因。

不幸的是,HttpResponse 上没有 .writeAllCharCodes 这样的东西。有writeAll,但它在字节数组的每个元素上调用toString() - 我们需要写入原始字节。

有什么建议吗?

【问题讨论】:

    标签: dart dart-io dart-async


    【解决方案1】:

    我认为这可能会对您有所帮助 - 我的速度提高了大约 4-5 倍:

    我将在这里添加我的完整示例:

    Future<ServerSocket> future = ServerSocket.bind("127.0.0.1", 1000);
    future.then((ServerSocket sock) {
      HttpServer s = new HttpServer.listenOn(sock);
    
      s.listen((HttpRequest req) {
        req.response.statusCode = HttpStatus.OK;
        req.response.headers.contentType = ContentType.parse("image/png");
        var file = new File("someImage.png");
    
        // Average of about 5-7ms
        Future f = file.readAsBytes();
        req.response.addStream(f.asStream()).whenComplete(() {
          req.response.close();
        });
        // Average of ~25-30ms
        /*
        file.readAsBytes().then((List<int> bytes) {
          bytes.forEach((int b) => req.response.writeCharCode(b)); // slow!
          req.response.close();       
        });
        */ 
      });
    });
    

    这能解决您的问题吗?

    问候 罗伯特

    【讨论】:

    • 只想提一下 res.addStream(stream).whenComplete(res.close) 和做 stream.pipe(res) 是一样的。
    【解决方案2】:

    考虑到@Anders Johnsen 的评论,您可以这样做。

    File f = new File( "image_file.png" )
      ..readAsBytes()
        .asStream()
        .pipe( req.response );
    

    我个人喜欢这个,因为它利用了 Darts 方法级联,但两者都可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 2010-10-15
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多