首页 > 解决方案 > 如何将 apache poi xls 工作簿直接流式传输到 akka-http 响应?

问题描述

这是一种避免将 Apache POI 工作簿写入字节数组或临时文件并将其流式传输到 akka-http 响应的方法吗?

val wb = new SXSSFWorkbook(new XSSFWorkbook())
...building workbook...
val os = new ByteArrayOutputStream() //or buffered file output stream
wb.write(os) // <- can I just get from akka-http some output stream to write workbook directly to response?

标签: scalaapache-poiakka-streamakka-http

解决方案


这就是您可以通过路线的Source[ByteString, _]方式complete

val route: Route = get {
  val (out, source) = StreamConverters.asOutputStream().preMaterialize()
  writeAsync(out)
  complete(HttpEntity(ContentTypes.`application/octet-stream`, source))
}

可能看起来像这样,writeAsync但您需要在new SXSSFWorkbook(new XSSFWorkbook()).write(os)此处使用

def writeAsync(out: OutputStream): Unit = {
  val random = new Random()
  Future {
    1 until 10000 foreach { _ =>
      out.write(random.nextPrintableChar().toInt)
    }
    out.close()
  }
}

方法out.write将被阻塞,直到有需求发送到Source. 阻塞的超时时间是通过asOutputStream()方法配置的


推荐阅读