scala - 如何在使用 Play Framework 处理文件后立即删除文件

标签 scala playframework playframework-2.5

我想用 Play 处理一个大的本地文件。 该文件在处理后应立即从文件系统中删除。使用 sendFile 方法会很容易,如下所示:

def index = Action {
  val fileToServe = TemporaryFile(new java.io.File("/tmp/fileToServe.pdf"))
  Ok.sendFile(content = fileToServe, onClose = () => fileToServe.clean)
}

但我想以流方式处理文件以减少内存占用:

def index = Action {
  val file = new java.io.File("/tmp/fileToServe.pdf")
  val path: java.nio.file.Path = file.toPath
  val source: Source[ByteString, _] = FileIO.fromPath(path)

  Ok.sendEntity(HttpEntity.Streamed(source, Some(file.length()), Some("application/pdf")))
    .withHeaders("Content-Disposition" → "attachment; filename=file.pdf")
}

在后一种情况下,我无法弄清楚流何时完成,我将能够从文件系统中删除文件。

最佳答案

您可以使用watchTerminationSource 上,在流完成后删除文件。例如:

val source: Source[ByteString, _] =
  FileIO.fromPath(path)
        .watchTermination()((_, futDone) => futDone.onComplete {
          case Success(_) =>
            println("deleting the file")
            java.nio.file.Files.delete(path)
          case Failure(t) => println(s"stream failed: ${t.getMessage}")
        })

关于scala - 如何在使用 Play Framework 处理文件后立即删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46830346/

相关文章:

scala - Scala 2.10中的错误是Iterator.size吗?

java - 我应该使用 Play Framework 还是普通的 Java EE

playframework - 如何在 Play 2.5 HikariCP 中启用 Dropwizard Metrics?

java - 注入(inject) WebJarAssets Controller 期间出现 NoSuchMethodError

scala - 播放 FakeMultipartRequest 意外输入结束

scala - 在 Spark 中重用连接的数据框

java - 将第三方数据库信息获取到 java 对象中的最简单方法

scala - 减少一组空集是否有效?

java - 如何在 MorphiaQuery 中检索 @Reference 字段/哪个是最好的 @Reference 或 @Embedded 和 SubQuery

java - 玩2.5 : Depedency injection in templates