将图像文件流高效地转换为HttpResponse [英] Stream image file to HttpResponse efficiently

查看:815
本文介绍了将图像文件流高效地转换为HttpResponse的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的服务器端DART网络应用程序为某些请求提供图片文件。



简化,以下是目前的功能:

  HttpServer.bind(InternetAddress.ANY_IP_V4,80)
.then((HttpServer服务器){
server.listen((HttpRequest请求){
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 单独写入每个字节是在这里减慢的事情。



不幸的是,在 .writeAllCharCodes .org / apidocs / channels / stable / dartdoc-viewer / dart%3aio.HttpResponserel =nofollow> HttpResponse 。有 writeAll ,但它调用 toString()对字节数组的每个元素 - 我们需要写原始字节。



/ p>

解决方案

我想这可能会帮助你 - 我加速了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);

//平均大约5-7ms
未来f = file.readAsBytes();
req.response.addStream(f.asStream())。
req.response.close();
});
//平均值〜25-30ms
/ *
file.readAsBytes()。 List< int> bytes){
bytes.forEach((int b)=> req.response.writeCharCode(b)); // slow!
req.response.close();
});
* /
});
});这是否解决了您的问题?



致谢
Robert


My server-side Dart web app serves image files for certain requests.

Simplified, here's what it currently does:

   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();       
        });    
      }
   }

This works, but it's fairly slow and I suspect that writing every byte individually via HttpResponse.writeCharCode is what's slowing things down here.

Unfortunately, there's no such thing as .writeAllCharCodes on HttpResponse. There's writeAll, but it calls toString() on every element of the byte array - we need to write the raw bytes.

Any suggestions?

解决方案

I think this might help you - I got a speed up of about 4-5 times:

I will add my complete example here:

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();       
    });
    */ 
  });
});

Does this resolve your problem?

Regards Robert

这篇关于将图像文件流高效地转换为HttpResponse的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆