如何将 apache poi xls 工作簿直接流式传输到 akka-http 响应?
How to stream apache poi xls workbook directly to akka-http response?
是否可以避免将 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, _]
作为 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()
方法
配置
是否可以避免将 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, _]
作为 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()
方法