如何通过播放框架正确提供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) 

}

我希望会做的伎俩