Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在使用Play Framework处理后立即删除文件_Scala_Playframework_Playframework 2.5 - Fatal编程技术网

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

Scala 如何在使用Play Framework处理后立即删除文件,scala,playframework,playframework-2.5,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) } 但我希望以流式方式处理文件,以

我想用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")
}
在后一种情况下,我无法确定流何时完成,我将能够从文件系统中删除该文件。

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

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}")
        })

在流上使用
.watchTermination
.mapMaterializedValue