Как передать apache poi xls книгу напрямую в ответ akka-http? - PullRequest
0 голосов
/ 07 мая 2020

Это способ избежать записи 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?

1 Ответ

1 голос
/ 08 мая 2020

Вот как вы можете передать 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() метода

...