我的服务器端 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/