如何在akka http中指定通过POST完成下载的文件名

vbkedwbf  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(140)

用户发送一个post请求,然后我根据post正文创建一个Excel文件(.xlsx),并希望将该文件发送回去,* 而不存储该文件本身 *。

def writeAsync(out: OutputStream): Unit = {
  Future {
    val wb = new XSSFWorkbook
    val sheet1: Sheet = wb.createSheet("sheet1");
    val os = new ByteArrayOutputStream()
    wb.write(os)
    os.writeTo(out)
    out.close()
    wb.close()
  }
}

...

pathPrefix("createAndDownloadExcel") {
  post {
    ...
    val generatedFileName = "customGeneratedFileName.xlsx" // <-- this name should the file name be like
    val (out, source) = StreamConverters.asOutputStream().preMaterialize()
    writeAsync(out)
    complete(HttpEntity(ContentTypes.`application/octet-stream`, source))
  }
}

响应包含excel内容,文件名为:“createAndDownloadExcel”,但我希望它的文件名基于单独生成的文件名。

稍后将根据POST主体手动生成该名称,因此,对pathPrefix(“fixedName.xlsx”)进行简单的更改并不能满足我的需要。
我如何解决这个问题,能够为返回的OutputStream给予一个动态文件名?

"org.apache.poi" % "poi-ooxml" % "5.2.0"
b4wnujal

b4wnujal1#

尝试添加响应标头Content-Disposition
HTTP上下文中的第一个参数要么是inline(默认值,表示它可以显示在Web页面内部,或者作为Web页面),要么是attachment(表示它应该被下载;大多数浏览器显示“另保存为”对话框,如果存在,则预先填充文件名参数的值)。

import akka.http.scaladsl.model.headers.ContentDispositionTypes.attachment
import akka.http.scaladsl.model.headers.`Content-Disposition`
....

respondWithHeader(`Content-Disposition`(attachment, Map("filename" -> "customGeneratedFileName.xlsx"))) {
  complete(HttpEntity(ContentTypes.`application/octet-stream`, source))
}

相关问题