【问题标题】:How to stream apache poi xls workbook directly to akka-http response?如何将 apache poi xls 工作簿直接流式传输到 akka-http 响应?
【发布时间】:2020-05-07 08:47:40
【问题描述】:

这是一种避免将 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?

【问题讨论】:

  • 你可以用Source[ByteString] stackoverflow.com/questions/48503489/…完成一个路由
  • @IvanStanislavciuc 正如我所得到的,在这个例子中,他们在内存中获取了整个数据,然后从中创建了 Source。您能给我写数据以直接从工作簿响应的代码示例吗?
  • 请检查我的答案

标签: scala apache-poi akka-stream akka-http


【解决方案1】:

这就是您如何将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()方法配置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多