2016-05-24 23 views
2

我有一個簡單的應用程序,它向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格式動態提供的數據? 這樣做的簡單方法是讓客戶不會提前閱讀完畢?

乾杯, 西蒙

回答

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) 

}

我希望會做的伎倆