如何通过播放框架正确提供CSV数据
问题描述:
我有一个简单的应用程序,它向DB提出问题,然后以简单文本的形式返回一些数据。 “简单/文本”响应恰好采用CSV格式。它被另一个程序读入(matlab,通过webread),然后我们“分析”。如何通过播放框架正确提供CSV数据
现在看来,播放框架已经改变了一些设置。而在此代码之前;
def singleEventsMultipleRegions(peril: String, region: List[String]) = Action.async {
val theResult = db.run(filter(peril, region).result)
val intermediate = theResult.map(result => header + result.mkString("\r\n"))
intermediate.map(item => Ok(item))
给我回到我想要的东西。现在,大约10000行后,matlab被切断。如果我在浏览器中查看结果,它会加载整个响应。相当令人沮丧。
不幸的是,我不明白发生了什么......有人知道吗?
其次,任何人都可以点我的方向......
的“天然”的策略以CSV格式动态提供的数据? 这样做的简单方法是让客户不会提前阅读完毕?
干杯, 西蒙
答
我这里有部分答案;
def allPerilStream = Action {
val stream = db.stream(allPerilsTable.result)
val source = Source.fromPublisher(stream.mapResult(u => u.aPeril + "\n")).map(ByteString.apply)
Ok.sendEntity(HttpEntity.Streamed(source, None, Some("")))
}
其中近的作品...但它不包含表头。
关于如何将头插入这样的流的任何想法?
所以,最后的结论如下。看起来有可能直接从期货(这花了我很长时间!!!!!)创造akka来源找出。一旦你知道,
def allPerilStream = Action {
val theResult = for(
result <- db.run(allPerilsTable.result)
) yield (
header +
result.mkString("\n")
)
val source = Source.fromFuture(theResult).map(ByteString.apply)
val entity = HttpEntity.Streamed(source, None, Some(""))
Ok.sendEntity(entity)
}
我希望会做的伎俩