scala - 如何将 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?
解决方案
这就是您可以通过路线的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()
方法配置的
推荐阅读
- javascript - 如何获得下一个和上一个项目?
- r - Obtain previous level of ordinal factor in R
- java - 图像未从 JavaFX 项目中 gradle 构建的 jar 加载
- java - 无法从java中的字符串解析字符
- reactjs - redux reducer 在一个动作后停止工作
- javascript - THREE.WebGLRenderer:纹理标记为更新但图像不完整使用 Aframe
- ssl - 使域指向另一个 https 域
- nginx - 如何在 nginx 配置文件中设置最大 mss
- typescript - 棘手的装饰类
- php - 在阿里巴巴 ECS 上使用 SSL 的视频流