dart - 高效地将图像文件流式传输到 HttpResponse

标签 dart dart-io dart-async

我的服务器端 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() - 我们需要写入原始字节。

有什么建议吗?

最佳答案

我认为这可能对您有帮助 - 我的速度提高了大约 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();       
    });
    */ 
  });
});

这能解决您的问题吗?

问候 罗伯特

关于dart - 高效地将图像文件流式传输到 HttpResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23318528/

相关文章:

json - 无法使用 Flutter 项目将 JSON 映射到 Dart 中的列表

dart - 如何创建/添加向每个请求添加默认 header 的中间件

dart - 我可以使用 Dart 获取跟踪所有异步调用的 "stack trace"吗?

dart - 我对 Dart 的 future 的理解是否正确?

dart - 使用 `pub run`命令运行脚本时如何找到包目录的路径

dart - 由于File.openRead和流处理而导致的内存泄漏?

dart - dart 中 "library"关键字的确切含义

flutter - 如何从Flutter中的API获取字符串值?

json - 在 Flutter 中忽略 jaguar 序列化程序中的空列表

Dart:HTTP header 不可变