如何使用play框架正确地提供csv数据

时间:2016-05-24 16:00:55

标签: playframework-2.5

我有一个简单的应用程序,它会向DB提出一个问题,然后将一些数据作为简单文本返回。 ' plain / text'响应恰好是CSV格式。它被另一个程序(matlab,通过webread)读入,然后我们进行分析'。

现在,Play框架似乎已经改变了一些设置。而在此代码之前;

  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))

准确地回复了我想要的东西。现在,matlab在大约10000行后被切断。如果我在浏览器中查看结果,它会加载整个响应。相当令人沮丧。

可悲的是,我不明白发生了什么......有人知道吗?

其次,有人能指出我的方向......

本地人'以CSV格式动态提供数据的策略? 这样做的简单方法是让客户没有尽早完成阅读?

干杯, 西蒙

1 个答案:

答案 0 :(得分:1)

我在这里有部分答案;

  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)

}

我希望能够做到这一点