如何在播放框架中发送大文件时捕获客户端断开连接?

问题描述:

我在播放应用程序响应中的文件。当客户端下载文件时,我正在从本地服务器清除文件。我正在使用以下代码实现此目的:如何在播放框架中发送大文件时捕获客户端断开连接?

val fileToServe = TemporaryFile(new File(fileName)) 
Ok.sendFile(fileToServe.file, onClose =() => { fileToServe.clean }) 

但是,当客户端断开连接时,临时文件仍保留在本地服务器中。但是我想处理这个断开连接并清理临时文件 。我听说onDoneEnumerating()但无法使用它。

任何人都可以指出我最简单的方法来处理断开连接并从本地服务器清理临时文件吗?

+0

为什么不跟踪影响所有连接的每个临时资源?如与连接池? – Fabien

+0

请指教我更多的细节 –

+0

这是我以前做的事情:每当收到一个连接,我将连接存储在一个全局连接所在的全局对象中。使用字典,我将每个连接所使用或分配的资源关联起来。断开连接时,很容易抓取已使用的资源并对这些资源采取适当的操作。至于'如何检测'断开连接,我不知道你的框架。但这是基本的,所以我想它已经实现了;-) – Fabien

TemporaryFile用于Play收到必须保存在临时文件位置的数据流,而不是发送文件。它在定稿(2.6前)或幻影文件参考(2.6.x)上删除。

搭上断线最简单的方法是调用Files.deleteIfExists

https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#deleteIfExists-java.nio.file.Path-

中的OnClose块。如果这似乎并不奏效出于某种原因,你可以使用临时文件收割者:

https://www.playframework.com/documentation/2.6.x/ScalaFileUpload#Cleaning-up-temporary-files

,将每隔一段时间清理临时文件目录。