はじめに
http4sを使ってCSVファイルをダウンロードさせたかったけれども、全くと言っていいほど資料が出てこなかったので書いておく。
環境
- Scala: 12.13
- http4s: 0.21
結論
どうやらhttp4sに使われてるfs2のStream
を利用してCSVの行を生成して適当なヘッダーを付けてレスポンスを返してやればよさそう(Excelで開きたかったら先頭にBomを付けてやる必要あり)。
例
適時importしてください。
val routes: HttpRoutes[IO] = HttpRoutes.of[IO] {
case GET -> Root / "download" =>
val bom = Stream.chunk(Chunk[Byte](0xef.toByte, 0xbb.toByte, 0xbf.toByte))
val csv = Stream.evalSeq(List("a,b,c","1,2,3")).intersperse("\n").through(fs2.text.utf8Encode)
val stream = bom ++ csv
Ok(
stream,
`Content-Type`(MediaType.text.csv, Charset.`UTF-8`),
`Content-Disposition`("attachment", Map("filename" -> "file.csv")))
}
これでブラウザからURLをたたけばCSVファイルがダウンロードされるはず。